user32.dllにSetClipboardViewerメソッドを使用してクリップボードフックを配置しようとしています
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
次に、フォームのWndProcメソッドをオーバーライドして、メッセージをキャッチします。
protected override void WndProc(ref Message message)
{
switch ((User32Handler.SystemMessages)message.Msg)
{
case User32Handler.SystemMessages.WM_DRAWCLIPBOARD:
if (MainForm.isFirstCopyPaste)
{
MainForm.isFirstCopyPaste = false;
return;
}
var data = Clipboard.GetDataObject();
if (data.GetDataPresent(DataFormats.Text))
{
NotifyIconMain.ShowBalloonTip(2000, "Text Copied", "Plain text copied", ToolTipIcon.Info);
}
User32Handler.SendMessage(_nextClipboardViewer, message.Msg, message.WParam, message.LParam);
break;
case User32Handler.SystemMessages.WM_CHANGECBCHAIN:
Debug.WriteLine("WM_CHANGECBCHAIN: lParam: " + message.LParam, "WndProc");
if (message.WParam == _nextClipboardViewer)
{
_nextClipboardViewer = message.LParam;
}
else
{
User32Handler.SendMessage(_nextClipboardViewer, message.Msg, message.WParam, message.LParam);
}
break;
default:
base.WndProc(ref message);
break;
}
}
これを実現することはできましたが、ウィンドウをユーザーから非表示にし、システムトレイにのみ表示したいと思います(タスクバーには表示しません)。
タスクバーからウィンドウを非表示にすると、フックが機能しなくなります。ウィンドウを元に戻しても機能しません。
誰かアイデアはありますか?