2009-11-10 119 views
0

我試圖去工作EnumThreadWindows一個電話,但我總是得到一個錯誤的參數錯誤,雖然我的代碼是this example on pinvoke.net幾乎相同。 我不知道爲什麼這不起作用:調用Win32的EnumThreadWindows()在C#

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

請包括您的EnumThreadWindows聲明和WNDENUMPROC委託。此外,如果您可以包含更多有用的錯誤信息。例如,你是否得到編譯時或運行時錯誤? 從託管代碼調用SetLastError毫無意義。 – 2009-11-10 15:30:43

+0

哦對不起,我忘了: [DllImport(「user32.dll」,SetLastError = true)] public static extern bool EnumThreadWindows(uint dwThreadId,WNDENUMPROC lpfn,IntPtr lParam); 公共委託布爾WNDENUMPROC(IntPtr的的HWND,IntPtr的LPARAM); 和我得到的錯誤,當我打電話Marshal.GetLastWin32Error(); 並使用FormatMessage格式化 – alex 2009-11-10 15:40:05

+0

用新信息編輯您的問題。評論沒有格式,所以幾乎不可能閱讀。 – ChrisF 2009-11-10 21:43:33

回答

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(); 

關於