2016-11-10 8 views
0

Так я строю инструмент, который называется «Clipboard History»Нажатие Ctrl + C на computer.keyboard

Моя цель, когда я что-то скопировать из любого места (веб-рс текст и т.д.) я хочу Добавьте my.computer.clipboard в datagridview.

все в порядке, так что я просто нужна команда или что-то, что признание Ctrl +C (в pckeyboard, не только формировать активный) и сделать один раз (Form1.DataGridView1.Rows.Add (DateAndTime.Now, Clipboard.GetText)

Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick 
    Dim keydata As Keys 
    If My.Computer.Keyboard.CtrlKeyDown AndAlso keydata.C Then 
     Form1.DataGridView1.Rows.Add(DateAndTime.Now, Clipboard.GetText) 

    End If 
End Sub 

спасибо :)

ответ

0

Там нет стандартной библиотеки .Net, что я знаю, что может сделать то, что вы хотите. С помощью функции Windows API AddClipboardFormatListener вы можете получать уведомления о предметах, размещенных на ClipBoard.

AddClipboardFormatListener требует дескриптор окна для отправки уведомления. Я использую класс, полученный от System.Windows.Forms.NativeWindow, для прослушивания WM_CLIPBOARDUPDATE. Этот класс, определенный ниже, выставляет с именем ClipBoardDataAvailable, который также может быть подписан, и он передал аргумент DataObject, который можно использовать для извлечения содержимого буфера обмена.

Imports System.Runtime.InteropServices 

Public Class ClipboardListener : Inherits NativeWindow 
    Implements IDisposable 
    Public Event ClipBoardDataAvailable(data As DataObject) 

    Public Sub New() 
     Me.CreateHandle(New CreateParams()) 
     AddClipboardFormatListener(Me.Handle) 
    End Sub 

    Public Overrides Sub DestroyHandle() 
     Me.Dispose() 
     MyBase.DestroyHandle() 
    End Sub 

    Protected Overrides Sub WndProc(ByRef m As Message) 
     Const WM_CLIPBOARDUPDATE As Int32 = &H31D 
     If m.Msg = WM_CLIPBOARDUPDATE Then 
      Dim data As DataObject = CType(Clipboard.GetDataObject, DataObject) 
      RaiseEvent ClipBoardDataAvailable(data) 
     End If 
     MyBase.WndProc(m) 
    End Sub 

    <DllImport("user32.dll", SetLastError:=True)> _ 
    Public Shared Function AddClipboardFormatListener(hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean 
    End Function 

    <DllImport("user32.dll", SetLastError:=True)> _ 
    Public Shared Function RemoveClipboardFormatListener(hWnd As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean 
    End Function 

#Region "IDisposable Support" 
    Private disposedValue As Boolean ' To detect redundant calls 

    ' IDisposable 
    Protected Overridable Sub Dispose(disposing As Boolean) 
     If Not Me.disposedValue Then 
      RemoveClipboardFormatListener(Me.Handle) 
     End If 
     Me.disposedValue = True 
    End Sub 

    ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources. 
    Protected Overrides Sub Finalize() 
     ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     Dispose(False) 
     MyBase.Finalize() 
    End Sub 

    ' This code added by Visual Basic to correctly implement the disposable pattern. 
    Public Sub Dispose() Implements IDisposable.Dispose 
     ' Do not change this code. Put cleanup code in Dispose(disposing As Boolean) above. 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 
#End Region 

End Class 

Пример:

Public Class Form1 
    Private WithEvents listener As New ClipboardListener 

    Private Sub listener_ClipBoardDataAvailable(data As DataObject) Handles listener.ClipBoardDataAvailable 
     If data.ContainsText Then Debug.Print(data.GetText) 
    End Sub 
End Class 
Смежные вопросы