イージークリップのコードは、次の通りです。読んでもらって、安心して使ってもらえれば、と思います。また、何かの参考にでもなれば幸せです。
Form1.vb と Form2.vb とに別れます。
まず、Form1.vb です。
Imports System.ComponentModel Public Class Form1 Const CHECKLINES = 18 '同じものがないか、チェックする行数,1ページ分 Const LISTLINES = 180 '最大行数(10ページ+1) Const CrLfReplaceWords = "<aabbccaabbccaabbcc>" '改行を維持するために、これで保存、読み込みのときに戻す Const TEXT_FILE_NAME = "listtext.txt" Const WINDOWPOS_FILE_NAME = "winpos.txt" Const RIGHTMOUSEDOWN = 1 Dim lb_index As Integer = -1 Dim pass_timer As Integer Public form2isopen As Boolean Private Sub CutOff(ll_num As Integer) Dim n, c As Integer c = ListBox1.Items.Count If c > ll_num Then For n = c - 1 To ll_num Step -1 ListBox1.Items.RemoveAt(n) Next End If End Sub Sub WriteList(tfname As String, lb As ListBox) Dim sw As New System.IO.StreamWriter(tfname, False) 'Falseは上書き、ファイルがなければ作ってくれる Dim n As Integer If lb.Items.Count = 0 Then Exit Sub End If For n = 0 To lb.Items.Count - 1 ' sw.WriteLine(CrLfReplace(lb.Items(n))) Next sw.Close() End Sub Private Function CrLfReplace(str As String) As String 'CrLfReplaceWords CrLfReplace = str.Replace(vbCrLf, CrLfReplaceWords) End Function Private Function CrLfBackReplace(Str As String) As String 'CrLfReplaceWords CrLfBackReplace = Str.Replace(CrLfReplaceWords, vbCrLf) End Function Sub SetList(tfname As String, lb As ListBox) If (Not (System.IO.File.Exists(tfname))) Then 'ファイルがなければパス Exit Sub End If Dim sr As New System.IO.StreamReader(tfname) Do While sr.EndOfStream = False lb.Items.Add(CrLfBackReplace(sr.ReadLine())) Loop sr.Close() End Sub Sub WriteWinPos(wpfname As String, fm As Form) If (fm.Left + fm.Top) < -100 Then 'windowsで閉じられたら書かない Exit Sub End If Dim sw As New System.IO.StreamWriter(wpfname, False) 'Falseは上書き、ファイルがなければ作ってくれる sw.WriteLine(fm.Left) sw.WriteLine(fm.Top) sw.Close() End Sub Sub SetWinPos(wpfname As String, fm As Form) If (Not (System.IO.File.Exists(wpfname))) Then 'ファイルがなければパス Exit Sub End If Dim sr As New System.IO.StreamReader(wpfname) Dim l, t As Integer t = sr.ReadLine() l = sr.ReadLine() sr.Close() fm.Location = New Point(t, l) End Sub Sub MoveUpList(lbindex As Integer, lb As ListBox) Dim targetlist, upperlist As String If lbindex = 0 Then Exit Sub End If targetlist = lb.Items(lbindex).ToString() upperlist = lb.Items(lbindex - 1).ToString() lb.Items.Item(lbindex - 1) = targetlist lb.Items.Item(lbindex) = upperlist lb.SelectedIndex = lbindex - 1 End Sub Sub MoveDowList(lbindex As Integer, lb As ListBox) Dim targetlist, lowerlist As String If lb.Items.Count - 1 = lbindex Then Exit Sub End If targetlist = lb.Items(lbindex).ToString() lowerlist = lb.Items(lbindex + 1).ToString() lb.Items.Item(lbindex) = lowerlist lb.Items.Item(lbindex + 1) = targetlist lb.SelectedIndex = lbindex + 1 End Sub Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load SetWinPos(WINDOWPOS_FILE_NAME, Me) Me.TopMost = True Me.WindowState = FormWindowState.Minimized '起動時は、タスクバーに SetList(TEXT_FILE_NAME, ListBox1) End Sub Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing WriteList(TEXT_FILE_NAME, ListBox1) WriteWinPos(WINDOWPOS_FILE_NAME, Me) If Form2.Visible = True Then Form2.Close() End If End Sub Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick Dim clp As String, m As Integer Static prev_clp As String If pass_timer = RIGHTMOUSEDOWN Then Exit Sub End If clp = Clipboard.GetText() If prev_clp = clp Then Exit Sub m = CHECKLINES If Len(clp) > 0 Then If ListBox1.Items.Count = 0 Then ListBox1.Items.Add(clp) GoTo exittimer ElseIf ListBox1.Items.Count < CHECKLINES Then m = ListBox1.Items.Count End If For n = 0 To m - 1 '同じものがないか、m(CHECKLINES)個チェック If clp = ListBox1.Items(n) Then ListBox1.SelectedIndex = n GoTo exittimer 'あればそのまま End If Next ListBox1.Items.Insert(0, clp) '同じものがないと、先頭に挿入する ListBox1.SelectedIndex = 0 '入りましたよ、と選択する End If CutOff(LISTLINES) '最大行数を超えれば、その分を削除 exittimer: prev_clp = clp Exit Sub End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click If Button1.Text = "最前面化" Then Me.TopMost = True Button1.Text = "通常化" Else Me.TopMost = False Button1.Text = "最前面化" End If End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Me.WindowState = FormWindowState.Minimized End Sub Private Sub ListBox1Click() Dim p_lbcliptext As String p_lbcliptext = ListBox1.SelectedItem Clipboard.SetText(p_lbcliptext) End Sub Private Sub ListBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseDown If e.Button = MouseButtons.Right Then pass_timer = RIGHTMOUSEDOWN If ListBox1.IndexFromPoint(e.Location) <> ListBox.NoMatches Then lb_index = ListBox1.IndexFromPoint(e.Location) '削除ToolStripMenuItem_Click用 ListBox1.SelectedIndex = lb_index End If ElseIf e.Button = MouseButtons.Left Then ListBox1Click() End If End Sub Private Sub 削除ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 削除ToolStripMenuItem.Click If lb_index < 0 Then 'ListBox1_MouseDown を経由しない場合 lb_index = ListBox1.SelectedIndex If lb_index < 0 Then Exit Sub '無選択でdeleteキーが押された場合 End If Clipboard.Clear() '削除するためにクリックしたものが上に追加されないように ListBox1.Items.RemoveAt(lb_index) lb_index = -1 '初期化 pass_timer = 0 End Sub Private Sub 終了ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 終了ToolStripMenuItem.Click pass_timer = 0 Me.Close() End Sub Private Sub クリアToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles クリアToolStripMenuItem.Click If MsgBox("本当に全部を削除しますか?", vbOKCancel) = vbCancel Then pass_timer = 0 Exit Sub End If ListBox1.Items.Clear() Clipboard.Clear() pass_timer = 0 End Sub Private Sub お決まりを開くToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles お決まりを開くToolStripMenuItem.Click pass_timer = 0 Form2.Show() form2isopen = True End Sub Private Sub お決まりへ追加ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles お決まりへ追加ToolStripMenuItem.Click pass_timer = 0 Form2.Show() form2isopen = True Form2.ListBox1.Items.Insert(0, ListBox1.SelectedItem.ToString) End Sub Private Sub キャンセルToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles キャンセルToolStripMenuItem.Click pass_timer = 0 End Sub End Class
次は、Form2.vb です。
Imports System.ComponentModel Public Class Form2 Const TEXT_FILE_NAME = "okimaritext.txt" Const WINDOWPOS_FILE_NAME = "okimariwinpos.txt" Dim lb_index As Integer = -1 Private Sub ReduceList() '同じものを削除 Dim lcount, n, m As Integer Dim ltext As String lcount = ListBox1.Items.Count For n = lcount - 1 To 1 Step -1 ltext = ListBox1.Items(n).ToString For m = n - 1 To 0 Step -1 If ltext = ListBox1.Items(m).ToString Then ListBox1.Items.RemoveAt(n) Exit For End If Next Next End Sub Private Sub Form2_Load(sender As Object, e As EventArgs) Handles Me.Load Form1.SetWinPos(WINDOWPOS_FILE_NAME, Me) Form1.SetList(TEXT_FILE_NAME, ListBox1) End Sub Private Sub Form2_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing ReduceList() Form1.WriteWinPos(WINDOWPOS_FILE_NAME, Me) Form1.WriteList(TEXT_FILE_NAME, ListBox1) End Sub Private Sub Form2_Closed(sender As Object, e As EventArgs) Handles Me.Closed Form1.form2isopen = False End Sub Private Sub ListBox1Click() Dim p_lbcliptext As String p_lbcliptext = ListBox1.SelectedItem Clipboard.SetText(p_lbcliptext) End Sub Private Sub ListBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseDown If e.Button = MouseButtons.Right Then If ListBox1.IndexFromPoint(e.Location) <> ListBox.NoMatches Then 'lb_index = ListBox1.IndexFromPoint(e.Location) '削除ToolStripMenuItem_Click用 ListBox1.SelectedIndex = ListBox1.IndexFromPoint(e.Location) End If ElseIf e.Button = MouseButtons.Left Then ListBox1Click() End If End Sub Private Sub 削除ToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 削除ToolStripMenuItem.Click If ListBox1.SelectedItem = Nothing Then Exit Sub '無選択でdeleteキーが押された場合 ListBox1.Items.RemoveAt(ListBox1.SelectedIndex) End Sub Private Sub クリアToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles クリアToolStripMenuItem.Click If MsgBox("本当に全部を削除しますか?", vbOKCancel) = vbCancel Then Exit Sub End If ListBox1.Items.Clear() Clipboard.Clear() End Sub Private Sub 閉じるToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 閉じるToolStripMenuItem.Click Me.Close() End Sub Private Sub 上に移動するToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 上に移動するToolStripMenuItem.Click If ListBox1.SelectedItem = Nothing Then Exit Sub End If Form1.MoveUpList(ListBox1.SelectedIndex, ListBox1) End Sub Private Sub 下に移動するToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles 下に移動するToolStripMenuItem.Click If ListBox1.SelectedItem = Nothing Then Exit Sub End If Form1.MoveDowList(ListBox1.SelectedIndex, ListBox1) End Sub End Class
以上です。