hwnd
句柄,以便我可以使用以下代码查找其背后的进程:,我希望我可以使用 message
对象中的 hwnd
,但这似乎是我自己的应用程序 – 可能是用此进程 id 通知应用程序:,如果我可以通过其他方式获得它,那么这当然也完全没问题,但我将不胜感激对此的任何见解:-),解决方案,根据@jimi的回答,这很简单。我可以将以下 3 行添加到我的原始代码中:,您可以调用getclipboardowner() 获取上次设置或清除剪贴板(触发通知的操作)的窗口句柄。,[…] 一般来说,剪贴板所有者是最后将数据放入剪贴板的窗口。emptyclipboard 函数分配剪贴板所有权。,在某些特殊情况下,进程会将空句柄传递给 openclipboard():阅读此函数的备注部分和 emptyclipboard 函数。,在调用 emptyclipboard 之前,应用程序必须打开剪贴板
通过使用 openclipboard 函数。如果应用程序指定
打开剪贴板时窗口句柄为null,emptyclipboard成功
但将剪贴板所有者设置为 null。请注意,这会导致
setclipboarddata 失败。,▶ 这里我使用的是 nativewindow 派生类来设置剪贴板侦听器。处理剪贴板更新消息的窗口是通过初始化 创建的createparams 对象并将此参数传递给 nativewindow.createhandle(createparams) 方法,用于创建一个不可见窗口。
然后重写初始化的nativewindow的
wndproc
,接收 wm_clipboardupdate
通知。,addclipboardformatlistener 函数用于将窗口放置在系统剪贴板侦听器链中。,▶ clipboardupdatemonitor
类在收到剪贴板通知时生成一个事件。事件中传递的自定义 clipboardchangedeventargs
对象包含由 getclipboardowner()
返回的剪贴板所有者的句柄、由 getwindowthreadprocessid() 和进程名称,由 process.getprocessbyid()。,您可以像这样设置 clipboardupdatemonitor
对象:该类也可以在
program.cs
中初始化,自定义 eventargs
对象,用于携带收集的有关剪贴板所有者的信息:,nativemethods
类:,