Получение дескриптора кнопки из другого приложения - PullRequest
6 голосов
/ 23 сентября 2010

У меня есть программа, которая должна отправить сообщение BM_CLICK другой кнопке приложения. Я могу получить дескриптор родительского окна, но когда я пытаюсь получить дескриптор кнопки, если всегда возвращает 0

Я получил название и тип кнопки от Spy ++, это кажется правильным, но я знаю, что, должно быть, что-то не так. ниже мой код

 public const Int BM_CLICK = 0x00F5;

 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);



private void button1_Click(object sender, EventArgs e)
{
    Process[] processes = Process.GetProcessesByName("QSXer");

    foreach (Process p in processes)
    {
        ////the Button's Caption is "Send" and it is a "Button".  
        IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", "Send");
       //ButtonHandle is always zero thats where I think the problem is 
    SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);

    }

}

Шпионский скриншот

alt text

Ответы [ 4 ]

5 голосов
/ 23 сентября 2010

Попробуйте передать null для текста окна и вместо этого попытайтесь найти любую кнопку:

IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, "Button", null);

После этого вы можете использовать второй параметр и новый вызов, чтобы получить следующую кнопку еще несколько раз.

Также не могли бы вы проверить Marshal.GetLastWin32Error, чтобы увидеть, каков результат ошибки?

2 голосов
/ 25 декабря 2012

Попробуйте это:

IntPtr ButtonHandle = FindWindowEx(p.MainWindowHandle, IntPtr.Zero, null, "Send");
1 голос
/ 14 декабря 2016

Вы можете сделать что-то вроде этого:

//Program finds a window and looks for button in window and clicks it

HWND buttonHandle = 0;

BOOL CALLBACK GetButtonHandle(HWND handle, LPARAM)
{
    char label[100];
    int size = GetWindowTextA(handle, label, sizeof(label));
    if (strcmp(label, "Send") == 0) // your button name
    {
        buttonHandle = handle;
        cout << "button id is: " << handle << endl;
        return false;
    }
    return true;
}

int main()

{
    HWND windowHandle = FindWindowA(NULL, "**Your Window Name**");

    if (windowHandle == NULL)
    {
        cout << "app isn't open." << endl;
    }

    else
    {
        cout << "app is open :) " << endl;
        cout << "ID is: " << windowHandle << endl;
        SetForegroundWindow(windowHandle);
        BOOL ret = EnumChildWindows(windowHandle, GetButtonHandle, 0); //find the button
        cout << buttonHandle << endl;
        if (buttonHandle != 0)
        {
            LRESULT res = SendMessage(buttonHandle, BM_CLICK, 0, 0);
        }
    }
}

Это должно сработать.

0 голосов
/ 21 ноября 2014

Попробуйте собрать проект как x86. Я стараюсь и преуспел!

...