Snippet

Sledování obsahu schránky

Přidáno: 1.6.2008       Kategorie: Aplikace       Autor: Ondřej Linhart

Ukázkový kód, který vám umožní sledovat schránku ve Windows a reagovat na změny jejího obsahu.

Na tomto principu funguje například funkce Monitor clipboard ve známém stahovacím programu FlashGet (zobrazí se okno pro nastavení stahování vždy když do schránky vložíte adresu URL).

Pro sledování zpráv ohledně schránky se neobejdete bez Windows API.

Imports System.Runtime.InteropServices
''' <summary>
''' Hlavní okno aplikace
''' </summary>
''' <remarks>Sledování zpráv ohledně schránky probíhá v hlavním okně aplikace.</remarks>
Public Class Form1
  'Ukazatel na okno
  Private clipboardViewer As IntPtr
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'Zaregistrovat hlavní okno aplikace do seznamu odběratelů
    'zpráv ohledně schránky.
    clipboardViewer = UnsafeNativeMethods.SetClipboardViewer(Me.Handle.ToInt32())
  End Sub
  ''' <summary>
  ''' Vyhodnocuje zprávy odeslané do hlavního okna aplikace.
  ''' </summary>
  ''' <param name="m">Zpráva.</param>
  ''' <remarks>Zde probíhá sledování zpráv ohledně schránky.</remarks>
  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Select Case m.Msg
      Case UnsafeNativeMethods.WM_DRAWCLIPBOARD
        'Zobrazit obsah schránky při změně (pokud schránka obsahuje text).
        If Clipboard.ContainsText() Then
          MessageBox.Show(Clipboard.GetText(), "Nový obsah schránky")
        End If
        UnsafeNativeMethods.SendMessage(clipboardViewer, m.Msg, m.WParam, m.LParam)
      Case UnsafeNativeMethods.WM_CHANGECBCHAIN
        'Ošetření stavu, kdy je hlavní okno aplikace odstraněno
        'ze seznamu odběratelů zpráv ohledně schránky.
        If m.WParam = clipboardViewer Then
          clipboardViewer = m.LParam
        Else
          SendMessage(clipboardViewer, m.Msg, m.WParam, m.LParam)
        End If
    End Select
    MyBase.WndProc(m)
  End Sub
  'Tuto metodu je třeba přemístit ze souboru Form1.Designer.vb
  'do souboru Form1.vb.
  Protected Overrides Sub Dispose(ByVal disposing As Boolean)
    Try
      If disposing AndAlso components IsNot Nothing Then
        components.Dispose()
        'Odstranit hlavní okno aplikace ze seznamu odběratelů zpráv ohledně schránky.
        UnsafeNativeMethods.ChangeClipboardChain(Me.Handle, clipboardViewer)
      End If
    Finally
      MyBase.Dispose(disposing)
    End Try
  End Sub
End Class
''' <summary>
''' Obsahuje definice a konstanty rozhraní Windows API.
''' </summary>
''' <remarks>Doporučený postup je umístit všechny Unmanaged definice do modulu nebo třídy s názvem UnsafeNativeMethods.</remarks>
Friend Module UnsafeNativeMethods
  Public Const WM_DRAWCLIPBOARD As Integer = 776
  Public Const WM_CHANGECBCHAIN As Integer = 781
  <DllImport("user32.dll")> _
  Public Function SetClipboardViewer(ByVal hWndNewViewer As Integer) As Integer
  End Function
  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Public Function ChangeClipboardChain(ByVal hWndRemove As Integer, ByVal hWndNewNext As Integer) As Integer
  End Function
  <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  Public Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
  End Function
End Module 
 

VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.