c#在最小化为托盘时,无法监听剪切板(clipboard)复制数据时候的变化

在做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)的生命周期,来实现监听功能

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值