簡體   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