我正在创建一个剪贴板监视器作为项目,并在剪贴板上更改应用程序通过调用GetClipboardOwner来检测哪个程序使用了剪贴板.这是代码的摘录:protected override void WndProc(ref Message m){const int WM_DRAWCLIPBOAR...

我正在创建一个剪贴板监视器作为项目,并在剪贴板上更改应用程序通过调用GetClipboardOwner来检测哪个程序使用了剪贴板.
这是代码的摘录:
protected override void WndProc(ref Message m)
{
const int WM_DRAWCLIPBOARD = 0x308;
const int WM_CHANGECBCHAIN = 0x030D;
switch (m.Msg)
{
case WM_DRAWCLIPBOARD:
Debug.Indent();
//Process the clipboard here
uint processId;
IntPtr ownerHwnd = GetClipboardOwner();
GetWindowThreadProcessId(ownerHwnd, out processId);
Process proc = Process.GetProcessById((int)processId);
Debug.WriteLine(String.Format("Window Title: {0} Filename: {1}", proc.MainWindowTitle, process.MainModule.FileName));
SendMessage(_NextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
case WM_CHANGECBCHAIN:
if (m.WParam == _NextClipboardViewer)
_NextClipboardViewer = m.LParam;
else
SendMessage(_NextClipboardViewer, m.Msg, m.WParam, m.LParam);
break;
default:
base.WndProc(ref m);
break;
}
}
和DLLImports:
[DllImport("User32.dll")]
public static extern IntPtr SetClipboardViewer(IntPtr _newviewerhandle);
[DllImport("User32.dll")]
public static extern bool ChangeClipboardChain(IntPtr removehandle, IntPtr nexthandle);
[DllImport("User32.dll")]
public static extern int SendMessage(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam);
[DllImport("User32.dll")]
public static extern IntPtr GetClipboardOwner();
[DllImport("kernel32.dll")]
public static extern int GetWindowThreadProcessId(IntPtr handle, out uint threadid);
输出窗口中的异常是 – Something.exe中出现’System.EntryPointNotFoundException’类型的第一次机会异常
更新2将“Kernel32”更改为“User32”后,它可以正常工作,但对于某些应用程序,如Word,Excel,我得到此异常; System.dll中出现’System.ComponentModel.Win32Exception’类型的第一次机会异常
有任何想法吗 ?
更新3上述异常是由于32位进程(我的应用程序)访问64位进程的模块(Word,Excel等)引起的
将配置更改为x64工作.
解决方法:
GetWindowThreadProcessId的DllImport应该使用user32.dll,而不是kernel32.dll
每个MSDN:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522(v=vs.85).aspx
或者只是使用PInvoke.Net:GetWindowThreadProcessId
本文标题为:c# – 获取进程ID时出错


基础教程推荐
- Unity shader实现多光源漫反射以及阴影 2023-03-04
- C#通过GET/POST方式发送Http请求 2023-04-28
- C#集合查询Linq在项目中使用详解 2023-06-09
- C# – NetUseAdd来自Windows Server 2008和IIS7上的NetApi32.dll 2023-09-20
- c#读取XML多级子节点 2022-11-05
- C#中类与接口的区别讲解 2023-06-04
- 使用c#从分隔文本文件中插入SQL Server表中的批量数据 2023-11-24
- c#中利用Tu Share获取股票交易信息 2023-03-03
- C# Winform实现石头剪刀布游戏 2023-01-11
- 京东联盟C#接口测试示例分享 2022-12-02