在C#中调用Win32 EnumThreadWindows()

时间:2009-11-10 15:17:34

标签: c# winapi

我正在尝试调用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;
    }
}

这有什么问题?

1 个答案:

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

问候