MouseDown, а затем MouseUp не работает - PullRequest
0 голосов
/ 02 февраля 2010

Я пытаюсь перенаправить ввод мыши в приложении Windows 7 в другое окно. Если я делаю это, когда получаю WM_LBUTTONUP, это работает (где MouseDown и MouseUp - функции SendInput в Win api):

SetForegroundWindow( other window );
SetCursorPos( somewhere on the window );
MouseDown();
MouseUp();
SetCursorPos( back );
SetForegroundWindow( main window );

Но я не хочу делать только отпуск мыши, я хочу иметь возможность захватывать все мышиные вещи, включая движения и перетаскивание.

Итак, это следующая логическая вещь, которую нужно сделать, но она не работает:

WM_LBUTTONDOWN:
Do everything like before without MouseUp()

WM_LBUTTONUP:
Do everything like before without MouseDown()

Это не работает даже для обычных кликов. Я не могу понять, почему. Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2010

Кнопки мыши в стиле фанк. Когда он поднимается, а затем поднимается, на каком-то уровне они преобразуются в щелчок (и я думаю, что в какой-то момент мышь вверх съедается, но я, возможно, вспоминаю это неправильно).

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

Я предлагаю вам распечатать много отладочной информации и попытаться выяснить, что именно делает система.

0 голосов
/ 02 февраля 2010

Возможно, стоит посмотреть на вызовы SendMessage / PostMessage P / Invoke и отправить сообщения прямо в окно другого приложения. Вам нужно выполнить некоторый перевод параметров, чтобы координаты событий мыши связывались с тем, что вы хотите от них в другом приложении, но это не составляет особого труда ...

Редактировать -> Я выкопал некоторый код, где я делал это раньше ... Это из окна, которое появляется поверх представления дерева и заменяет всплывающую подсказку окон по умолчанию для этого представления дерева.

    private IntPtr _translate(IntPtr LParam)
    {
        // lparam is currently in client co-ordinates, and we need to translate those into client co-ordinates of
        // the tree view we're attached to
        int x = (int)LParam & 0xffff;
        int y = (int)LParam >> 16;

        Point screenPoint = this.PointToScreen(new Point(x, y));
        Point treeViewClientPoint = _tv.PointToClient(screenPoint);

        return (IntPtr)((treeViewClientPoint.Y << 16) | (treeViewClientPoint.X & 0xffff));
    }

    const int MA_NOACTIVATE = 3;

    protected override void WndProc(ref Message m)
    {
        switch ((WM)m.Msg)
        {
            case WM.LBUTTONDBLCLK:
            case WM.RBUTTONDBLCLK:
            case WM.MBUTTONDBLCLK:
            case WM.XBUTTONDBLCLK:
            {
                IntPtr i = _translate(m.LParam);
                _hide();
                InteropHelper.PostMessage(_tv.Handle, m.Msg, m.WParam, i);
                return;
            }
            case WM.MOUSEACTIVATE:
            {
                m.Result = new IntPtr(MA_NOACTIVATE);
                return;
            }
            case WM.MOUSEMOVE:
            case WM.MOUSEHWHEEL:
            case WM.LBUTTONUP:
            case WM.RBUTTONUP:
            case WM.MBUTTONUP:
            case WM.XBUTTONUP:
            case WM.LBUTTONDOWN:
            case WM.RBUTTONDOWN:
            case WM.MBUTTONDOWN:
            case WM.XBUTTONDOWN:
            {
                IntPtr i = _translate(m.LParam);
                InteropHelper.PostMessage(_tv.Handle, m.Msg, m.WParam, i);
                return;
            }         
        }
        base.WndProc(ref m);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...