[英]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.