繁体   English   中英

在C#中调用Win32 EnumThreadWindows()

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM