クリップボード(クリップボード)は、Windowsに組み込まれた非常に便利なツールであり、さまざまなアプリケーションを使用できるようにします。それらの間で情報を転送および共有することができます。ただし、問題は、クリップボードに保持できるデータのコピーは 1 つだけであり、新しいデータが渡されるたびに古いデータが上書きされてしまうことです。
は SetClipboardViewer であり、クリップボードの内容が変更されるたびに、この関数は WM_DRAWCLIPBOARD メッセージを通じて通知されたウィンドウ チェーンにウィンドウを追加します。
クリップボード ビューア チェーン内の次のウィンドウへのハンドルがまだ返されていないため、アプリケーションは SetClipboardViewer
呼び出し中に受信した WM_DRAWCLIPBOARD メッセージを渡すべきではありません。
クリップボード オブザーバー チェーンからウィンドウ チェーンを削除する場合、アプリケーションは ChangeClipboard メンバー関数を呼び出す必要があります。
#region Definitions //Constants for API Calls... private const int WM_DRAWCLIPBOARD = 0x308; private const int WM_CHANGECBCHAIN = 0x30D; //Handle for next clipboard viewer... private IntPtr mNextClipBoardViewerHWnd; //API declarations... [DllImport("user32.dll", CharSet = CharSet.Auto)] static public extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer); [DllImport("user32.dll", CharSet = CharSet.Auto)] static public extern bool ChangeClipboardChain(IntPtr HWnd, IntPtr HWndNext); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam); #endregion
オペレーティング システムは、左ボタンを押したり左ボタンを押したりする一連のメッセージをアプリケーションに送信し、アプリケーションは最終的にメッセージをウィンドウ プロセス (WndProc [フルネーム]) に送信します。英語] GetMessage およびその他のメソッド Windows プロセスを介して]) アプリケーション定義のウィンドウ プロシージャへのポインター。
クリップボードのコンテンツ変更イベントを処理するには、この関数を書き直す必要があります:
#region Message Process //Override WndProc to get messages... protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_DRAWCLIPBOARD: { //The clipboard has changed... //########################################################################## // Process Clipboard Here :)........................ //########################################################################## SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); //显示剪贴板中的文本信息 if (Clipboard.ContainsText()) { label1.Text = Clipboard.GetText(); } //显示剪贴板中的图片信息 if (Clipboard.ContainsImage()) { pictureBox1.Image = Clipboard.GetImage(); pictureBox1.Update(); } break; } case WM_CHANGECBCHAIN: { //Another clipboard viewer has removed itself... if (m.WParam == (IntPtr)mNextClipBoardViewerHWnd) { mNextClipBoardViewerHWnd = m.LParam; } else { SendMessage(mNextClipBoardViewerHWnd, m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); } break; } } base.WndProc(ref m); } #endregion
効果:
以上がC# で Windows クリップボード モニターを実装するためのコードの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。