Как вызвать GetGUIThreadInfo в c # - PullRequest
2 голосов
/ 19 июня 2010

У меня есть дескриптор окна, и я пытаюсь вызвать GetGUIThreadInfo, передавая идентификатор процесса окна. Я всегда получаю сообщение об ошибке «Параметр неверен» при вызове GetGUIThreadInfo, и я могу понять, почему. Кто-нибудь заставил это работать?

[DllImport("user32.dll", SetLastError = true)]
public static extern bool GetGUIThreadInfo(unit hTreadID, ref GUITHREADINFO lpgui);

[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(unit hwnd, out uint lpdwProcessId);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int iLeft;
    public int iTop;
    public int iRight;
    public int iBottom;
}

[StructLayout(LayoutKind.Sequential)]
public struct GUITHREADINFO
{
    public int cbSize;
    public int flags;
    public IntPtr hwndActive;
    public IntPtr hwndFocus;
    public IntPtr hwndCapture;
    public IntPtr hwndMenuOwner;
    public IntPtr hwndMoveSize;
    public IntPtr hwndCaret;
    public RECT rectCaret;
}

public static bool GetInfo(unit hwnd, out GUITHREADINFO lpgui)
{ 
    uint lpdwProcessId;
    GetWindowThreadProcessId(hwnd, out lpdwProcessId);

    lpgui = new GUITHREADINFO();
    lpgui.cbSize = Marshal.SizeOf(lpgui);

    return GetGUIThreadInfo(lpdwProcessId, ref lpgui); //<!- error here, returns false
}

1 Ответ

3 голосов
/ 19 июня 2010

Я думаю, что вы используете неправильное значение из вызова GetWindowThreadProcessId, если вы посмотрите документацию здесь , вы увидите, что вторым параметром является идентификатор процесса (как вымы назвали его), но идентификатор потока находится в возвращаемом значении.

Другими словами, я думаю, что ваш код должен быть таким (непроверенным):

public static bool GetInfo(unit hwnd, out GUITHREADINFO lpgui)
{ 
    uint lpdwProcessId;
    uint threadId = GetWindowThreadProcessId(hwnd, out lpdwProcessId);

    lpgui = new GUITHREADINFO();
    lpgui.cbSize = Marshal.SizeOf(lpgui);

    return GetGUIThreadInfo(threadId, ref lpgui); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...