ライトクリップ-コピー履歴を保存

Cocoon-inWordPress

ウインドウズには、普通のコピー、ペースト以外に、「クリップボード」というものがありますが、万能、便利なようで、意外と不便だと感じます。

WordPress=ブログを始めて、テキストに特化した、軽快なクリップボードがどうしても欲しくなり、VB.NETで「ライトクリップ」を作りました。

ウィンドウズのクリップボードとは?

Windows付属のクリップボードは、テキストエディタでも、このWordPressでも使えます。WindowsキーとVキーを押すと、

Windowsクリップボード

のようにクリップボードが現れます。どれかをクリックすれば、カーソルのある場所に貼り付けられるのです。

右肩の「・・・」をクリックすると、「ピン留めする」などのメニューも現れます。画像なども含まれているので、大変便利なものです。

軽快なクリップボードが、やはり欲しい

しかし、テキスト編集に限ってみると、貼り付けたらすぐ隠れてしまう、いちいちスクロールして探すのが面倒、などの不便があります。テキスト編集には立派すぎるのです。高級自動車も良いものかもしれませんが、自転車の代えがたい便利さもあります。

そこで、自転車、というよりむしろ、歩きのような軽い、サクサク動く、便利なクリップボード=「ライトクリップ」を作ってみました。

コピーしたテキストをリストに保存

起動すると、次のようなウインドウが開きます。コピーする度に、リストボックスにどんどん、上から追加されていきます。このリストの中から、どれか欲しいものをクリックすれば、今度は、それがクリップボードにコピーされて、編集中のテキストに貼り付けることができます。

ウインドウは常時最前面にも、通常にも

起動直後は(↓)、ウインドウが常時最前面の状態です。

「通常化」ボタンをクリックすると、常時最前面ということではなく、通常のウインドウになります。

これ(↑)は、通常ウインドウの状態で、他のウインドウの後ろになったりもします。ここで、「最前面化」ボタンをクリックすると、

のように(↑)、また最初の常時最前面ウインドウに戻ります。

その時々で、使いやすい状態を選ぶことができます。

右の「最小化」ボタンをクリックすると、最小化され、タスクバーのアイコンだけになります。タスクバーのアイコンをクリックすれば、元に戻ります。

右肩の「×」ボタンをクリックすると、終了します。

軽いアプリなので、ショートカットをWindowsのスタートアップ・フォルダに入れておくと、パソコンを起動する度に、ライトクリップも起動します。こうして常駐させておくと、「あっ、さっきコピーしたものがまた欲しい」と思った時に、大変助かります。

リストボックス内で、右クリックメニューで、「クリア」を選択しますと、全て消えます。

コピーをする度にリストに保存

テキストをコピーすると、その度に、リストに上から追加されます。リストの限度は50までとしました。それ以上になると、自動的に下から削除します。あまり多くなると、重くなるので、50あれば十分だと、思います。

新たにコピーすると、リストの上から10項目をチェックして、同じテキストがすでにあれば、追加はしません。

リストが11個以上になって、11番目以下をクリックすると、そのテキストが最上位に追加されます。この場合も、10項目内に同じものがあれば、追加はされません。

VB.NET コード

コードは次のようなものです。安心していただけたら、下でダウンロードして、使ってみてください。ウインドウの最前面化には、SetWindowPos を使いました。

Public Class Form1
    Private Const CHECKLINES = 10    '同じものがないか、チェックする行数
    Private Const LISTLINES = 50    '最大行数

    Private Const HWND_TOPMOST = -1
    Private Const HWND_NOTOPMOST = -2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2

    Private Declare Function SetWindowPos Lib "user32" _
    (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

    Private Sub FormPosition(Optional wndtop% = HWND_TOPMOST)
        Select Case wndtop%
            Case HWND_TOPMOST
                SetWindowPos(Me.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE)
            Case HWND_NOTOPMOST
                SetWindowPos(Me.Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE)
        End Select
    End Sub
    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
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        FormPosition()
        Me.WindowState = FormWindowState.Minimized
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Dim clp As String, n, m As Integer

        clp = Clipboard.GetText()
        m = CHECKLINES
        If Len(clp) > 0 Then
            If ListBox1.Items.Count = 0 Then
                ListBox1.Items.Add(clp)
                Exit Sub
            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.SetSelected(0, False)  '最新のもの以外は選択解除
                    Exit Sub
                End If
            Next
            ListBox1.Items.Insert(0, clp)   '同じものがないと、先頭に挿入する
            ListBox1.SelectedIndex = 0      '入りましたよ、と選択する
        End If
        CutOff(LISTLINES)   '最大行数を超えれば、その分を削除
    End Sub

    Private Sub ListBox1_Click(sender As Object, e As MouseEventArgs) Handles ListBox1.MouseClick
        Dim p_lbcliptext As String
        If ListBox1.SelectedItem = Nothing Then
            Exit Sub
        End If
        p_lbcliptext = ListBox1.SelectedItem
        Clipboard.SetText(p_lbcliptext) 'クリックしたものが、
        '先頭のCHECKLINES個になければ、リストの先頭に移動する
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If Button1.Text = "最前面化" Then
            FormPosition(HWND_TOPMOST)
            Button1.Text = "通常化"
        Else
            FormPosition(HWND_NOTOPMOST)
            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 クリアToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles クリアToolStripMenuItem.Click
        ListBox1.Items.Clear()
        Clipboard.Clear()
    End Sub
End Class

機能を追加しました

1つは、終了時に(あるいはControl + S で)、リストを自動的に「listtext.txt」として保存し、再起動した際に、それを読み込んで以前のリストを再生するようにしました。

2つ目は、他のアプリを使っていて、ライトクリップのリストをクリックした時に、クリップボードにうまくセットされていない時がありました。確かに、セットされたことを、確認するために、クリックしたものが一番上に表示されるようにしました。

ライトクリップのダウンロード

user32ライブラリーを使うため、フォルダごとまとめて置いておく必要があります。解凍しますと、「lightclip」という名前のフォルダになります。その中には、次のようなファイルがあります。

lightclipフォルダを適当な場所に、そのまま置いて、そのなかの lightclip.exe をダブルクリックすると、ライトクリップが起動します。

ダウンロードの際に、次のような警告が出ます。ダウンロードした上で、

アンチウイルスソフト(右クリックメニューでMicorsoft Definderなど)でスキャンしてから、お使い下さい。

コメント

タイトルとURLをコピーしました