我正在尝试调用EnumThreadWindows工作,但我总是得到错误的参数错误,尽管我的代码与this example on 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;
}
}
这有什么问题?
答案 0 :(得分:1)
我相信您的EnumThreadWindows调用应该可以正常工作,问题似乎在
uint ThreadID = GetThreadID(MainHWND);
调用;看起来你正试图在那里传递窗口句柄,这不是它期望从你那里得到的,更多细节在这里:http://msdn.microsoft.com/en-us/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();
问候