Отправка Click с помощью user32.dll, сообщения появляются в spy++, но кнопка не нажимается

У меня проблемы с отправкой клика в приложение с user32.dll. кнопка не нажимается, но в spy++ появляется сообщение. я использую вин7 х64

Код написан на С#:

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr FindWindow(string strClassName, string strWindowName);

    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lpClassName, string lpWindowTitle);

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

    [DllImport("user32.dll")]
    static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);

    //
    // Finds a window in the whole tree of childs for a parent window.
    //
    static IntPtr FindWindowRecursive(IntPtr hParent, string szClass, string szCaption)
    {
        IntPtr hResult = FindWindowEx(hParent, IntPtr.Zero, szClass, szCaption);
        if (hResult != IntPtr.Zero)
            return hResult; // found it

        // enumerate all childs and if found one that has childs go in
        IntPtr hChild = FindWindowEx(hParent, IntPtr.Zero, null, null); // first child
        if (hChild != IntPtr.Zero)
        {
            // let's enumerate
            do
            {
                hResult = FindWindowRecursive(hChild, szClass, szCaption);
                if (hResult != IntPtr.Zero)
                    return hResult;  // found it
            } while ((hChild = GetWindow(hChild, GW_HWNDNEXT)) != IntPtr.Zero);
        }

        return IntPtr.Zero; // no childs, so no window was found
    }

    static void Main(string[] args)
    {
        IntPtr win = FindWindow("Omnipage17_MainWnd_Class", "Unbenanntes OmniPage-Dokument 1 - OmniPage");
                SetForegroundWindow(win);
        ShowWindowAsync(win, SW_RESTORE);
        IntPtr ButtonHandle = FindWindowRecursive(win, "BarButton", "c");
        SetActiveWindow(win);
        //sEND Lbuttondown
        IntPtr ptr = SendMessage(ButtonHandle, 0x0201, new IntPtr(0x0001), MakeLParam(81,28));
        //Thread.Sleep(10);
        //Mousemove
        ptr = SendMessage(ButtonHandle, 0x0200, new IntPtr(0x0001), MakeLParam(86,24));
        //lbuttonup
        ptr = SendMessage(ButtonHandle, 0x0202, new IntPtr(0x0001), MakeLParam(81, 28));

        //SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
    }

Вот сообщения spy++ этой кнопки: введите здесь описание изображения

Если я отправляю сообщения, я получаю следующее: я не знаю, если это проблема, но lbuttondown, buttoup появляется 2 раза ( S + R ), и если я нажимаю его вручную, он получает 1 сообщение (P) также пытался сделайте это с помощью WM_CLICK, но тогда у меня с ним такая же проблема

Редактировать: сейчас используется PostMessage, поэтому spy++ показывает те же сообщения, что и при нажатии вручную, но все равно кнопка не нажата

введите здесь описание изображения


С этой библиотекой у меня та же проблема.

код:

SetForegroundWindow(win);
Rectangle re;
GetWindowRect(ButtonHandle, out re);

Cursor.Position = new Point((re.X + re.Width)/2, (re.Y + re.Height)/2);
WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.LBUTTON);
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.LBUTTON);

Сообщение отправлено, но кнопка не нажата введите здесь описание изображения

Изменить:

спасибо за ссылку (http://www.hanselman.com/blog/IntroductionLync2010SuperSimpleAutoAnswerVideoKioskWithFullScreen.aspx), но и с этой библиотекой у меня такая же проблема :/

код:

SetForegroundWindow(win);
Rectangle re;
GetWindowRect(ButtonHandle, out re);

Cursor.Position = new Point((re.X + re.Width)/2, (re.Y + re.Height)/2);
WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.LBUTTON);
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.LBUTTON);

Сообщение отправлено, но кнопка не нажата введите здесь описание изображения

Изменить2:

Ответ пользователя был удален, потому что я разместил свой комментарий как ответ:

Это не ответ, это относится к вашему вопросу. Это не соответствует вашему коду, очевидно, вы все еще публикуете BM_CLICK. Что неправильно, его нужно отправить, и вы должны либо отправить BM_CLICK, либо опубликовать сообщения мыши. И вы смотрите не в то окно, родитель кнопки получает уведомление BN_CLICK и действует на него. Неправильное состояние клавиатуры процессов было бы типичным режимом отказа. — Ханс Пассант 18 часов назад

В связи с этим, почему это должны быть родительские окна? bcs в spy++ (скриншот ниже, который я искал для этой кнопки (класс: BarButton), и дескриптор, который я получаю из user32.dll, также такой же, как и в spy++ введите здесь описание изображения


person user1519979    schedule 12.07.2012    source источник


Ответы (1)


Скотт Хансельман недавно написал в блоге что-то похожее на это http://www.hanselman.com/blog/IntroductionLync2010SuperSimpleAutoAnswerVideoKioskWithFullScreen.aspx

person harryovers    schedule 12.07.2012