Вызов Win32 EnumThreadWindows () в C # - PullRequest
       6

Вызов Win32 EnumThreadWindows () в C #

0 голосов
/ 10 ноября 2009

Я пытаюсь заставить работать вызов 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;
    }
}

В чем проблема с этим?

1 Ответ

1 голос
/ 11 ноября 2009

Я считаю, что ваш вызов 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();

и остальная часть вашего кода работала нормально для меня

Также, если вы хотите получить идентификатор потока для данного обработчика окна, приведенный ниже код может дать вам представление о том, как это сделать:

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

привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...