首先,我想简单描述一下我究竟想做什么。
大家都应该发现,剪贴板中有文本内容的时候,Word的“粘贴”菜单或者工具栏上的“粘贴”按钮或者Windows记事本的“粘贴”菜单都会马上又禁用状态变成启用状态,而清空剪贴板后,又会马上变成禁用状态,也就说,这些程序能实时监控剪贴板吧。我就是想做到这样。一开始,我是通过使用timer控件以及Clipboard类的ContainsText()方法来隔200ms检查一次剪贴板从而实现类似的效果。虽然我很菜,但我也明白实际上并不是这样实现的。后来在MSDN上找到一个功能很齐全的基于WPF开发的记事本示例源代码(在这里下载),本来很开心的以为终于都能够知道真正的实现方法究竟是怎样的了,可是我看完了里面的所有代码,就是搞不明白他是如何实现“复制,剪切,粘贴”这3个功能的,我完全找不到实现这3个功能的相关代码,更别说控制菜单的状态了,或者是因为我太菜了吧(而且基础还没打好)。于是我又搜索了一下MSDN,然后我找到这样一篇文章(点这里打开),讲述C++如何使用Windows剪贴板,其中这样说道:“剪切”、“复制”和“粘贴”命令只在某些上下文中有意义。只有当选定某内容时才启用“剪切”和“复制”命令;而只有当某内容在剪贴板中时才启用“粘贴”命令。可通过定义更新处理函数提供该行为(更新处理函数会根据上下文启用或禁用这些命令)。有关更多信息,请参见如何更新用户界面对象。然后我又转到“如何更新用户界面对象”页面,虽然我不懂C++,但大概的意思算是明白了,可是C#貌似没有类似的技术,那么究竟用C#应该如何实现啊?希望懂的高手赐教一下,或者C#基础好的高手麻烦研究一下微软的那个WPF记事本代码找出真相,谢谢!

解决方案 »

  1.   

    使用API SetClipboardViewer来监视剪贴板....
    Hope this helps... 
    public partial class Form1 : Form {
            private const int WM_DRAWCLIPBOARD = 776;        [DllImport("user32.dll")]
            public static extern int SetClipboardViewer(int windowHandle);        public Form1() {
                InitializeComponent();
                // within the initialization code
                SetClipboardViewer(Handle.ToInt32());
            }        protected override void WndProc(ref Message message) {
                base.WndProc(ref message); // Process the message 
                if (message.Msg == WM_DRAWCLIPBOARD) {
                    // act on Clipboard changes
                    if (Clipboard.ContainsText()) {
                        MessageBox.Show(Clipboard.GetText());
                    } else {
                        MessageBox.Show("Clipboard is empty now, change your menu status:)");
                    }
                }
            }
        }
      

  2.   

    谢谢啊,这个方法确实可行,不过我想再等待一下,希望有人知道微软那个WPF Notepad是怎样实现的,我真的找不到那个WPF Notepad实现复制,剪切,粘贴这3个功能的代码,其他功能的代码我都能找到,都不知道是怎么实现的。
      

  3.   

    其实我本来就很在意那个WPF Notepad里面设置的那些Command属性了,很明显这是WPF新增的属性来的,不过由于我不懂WPF,一直都没怎么理会它。
    刚刚搜索了一下,发现原来那个Command属性还真不简单,原来只要在那个Command属性里打上“Paste”就实现了粘贴功能了,只要程序主界面有Textbox控件就可以正常使用了,不但能正常使用粘贴功能,而且功能的开启禁用状态都能根据剪贴板的状况来实时更新,简直是不费吹灰之力。虽然“风吹过”提供了很好的实现方法,不过我还是想知道究竟C#有没有类似C++那样能够通过更新用户界面对象来实现的方法?毕竟“风吹过”的方法局限性很大,仅适用于“粘贴”功能的状态检测控制,而通常一款软件都有很多功能需要控制其开启或者禁用,这个问题很烦人,不知道大家是如何解决的(其实我在想,这个问题是不是应该开一条新帖比较好呢,毕竟现在貌似很难让人留意到,嘛还是先改改标题看看效果如何吧。:))?