[英]Calling Win32 EnumThreadWindows() in C#
我试图让EnumThreadWindows正常工作,但是我总是收到错误的参数错误,尽管我的代码与pinvoke.net上的示例几乎相同。 我不知道为什么这行不通:
public static IntPtr FindMsgBoxFrom(IntPtr MainHWND)
{
SetLastError(0);
uint ThreadID = GetThreadID(MainHWND);
EnumThreadWindows(ThreadID, new WNDENUMPROC(decoder.FindMsgBox), IntPtr.Zero);
int last = Marshal.GetLastWin32Error();
if (last != 0)
MessageBox.Show("EnumThreadWindows-Error:\n" + GetLastErrorString());
return MSGHWND;
}
这是decoder.FindMsgBox
:
public static bool FindMsgBox(IntPtr hwnd, IntPtr lparam)
{
if (IsMsgBox(hwnd))
{
MSGHWND = hwnd;
return false;
}
else
return true;
}
}
这是什么问题?
我相信您的EnumThreadWindows调用应该可以正常工作,问题似乎出在
uint ThreadID = GetThreadID(MainHWND);
呼叫; 似乎您正在尝试在其中传递窗口句柄,但这与它希望从您那里获得的不完全相同,请参见此处的更多详细信息: http : //msdn.microsoft.com/zh-cn/library/ms683233(VS。 85).aspx
我试图将上面的行更改为以下代码:
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
<...>
uint ThreadID = GetCurrentThreadId();
您的其余代码对我来说也很好
另外,如果您要获取给定窗口处理程序的线程ID,下面的代码可能会给您一个有关如何执行的想法:
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
public static uint GetThreadIdForForegroundWindow()
{
IntPtr hwnd = GetForegroundWindow();
return (hwnd!=IntPtr.Zero) ? GetWindowThreadProcessId(hwnd, IntPtr.Zero) : 0;
}
<...>
uint ThreadID = GetThreadIdForForegroundWindow();
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.