在做C#开发中,有一个需求是写一个托盘程序用于监听剪贴板的数据复制。
我遇到的问题是在正常情况下可以监听clipboard的数据变化,但是当我缩小为托盘程序的时候,托盘程序就无法监听剪贴板的数据变化了,再次双击托盘图标,还是照样的不能
实现监听板的监听功能。
原因分析:
在C#开发中,我使用的是
<code> [DllImport("user32")]
private extern static IntPtr SetClipboardViewer(
IntPtr hWnd);
[DllImport("user32")]
private extern static int ChangeClipboardChain(
IntPtr hWnd,
IntPtr hWndNext);
[DllImport("user32", CharSet = CharSet.Auto)]
private extern static int SendMessage(
IntPtr hWnd,
int wMsg,
IntPtr wParam,
IntPtr lParam);
</code>这三个方法来实现的剪贴板的复制功能。Form默认正常显示,点击关闭按钮后,缩小为托盘程序,以便于在后台监听
<code> protected override void WndProc(ref Message e)</code>用于获取监听到的剪贴板的数据数据,具体如何实现可以网上查找。
我在程序的实现中有对Form中的ShowInTaskbar这个属性的值进行修改,初始设置为false,因为我的Form默认是不显示出来,只是显示托盘程序,如果不设置为false的话,会在任务栏显示该应用程序正在运行,当重新设置了该属性之后。就无法进行CLIPBORAD的监听动作。
在Form中,我们如果改变它的一些属性,会导致该Form对应的句柄(Handle)值发生改变。这个时候,如果与之相关的方法没有进行及时更新Handle就会导致无法接受到复制事件。
解决方案:
当句柄值发生时,我们重新对其赋值,具体为
监听Form的 <code>HandleCreated</code>,<code> HandleDestroyed </code>事件,监听HandleDestroyed目的是为了在适当的时候注销掉剪贴板的监听功能,
即 调用<code> private extern static int ChangeClipboardChain(
IntPtr hWnd,
IntPtr hWndNext);</code>
当HandleCreated事件发生的时候。调用 <code>private extern static IntPtr SetClipboardViewer(
IntPtr hWnd);</code>方法。
这样我们就可以跟踪句柄(Handle)的生命周期,来实现监听功能