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