如何获取更新剪贴板的应用程序的进程ID或名称?

我正在用 c# 创建剪贴板管理器,有时我会遇到剪贴板被某些应用程序设置为空的情况。,这发生在例如excel 取消选择刚刚复制的内容时,因此我需要确定剪贴板是否为空,但是如何获取更新剪贴板的应用程序名称?,我希望我能以某种方式获得更新剪贴板的应用程序的 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 类:,
返回顶部
跳到底部

Copyright 2011-2024 南京追名网络科技有限公司 苏ICP备2023031119号-6 乌徒帮 All Rights Reserved Powered by Z-BlogPHP Theme By open开发

请先 登录 再评论,若不是会员请先 注册