О WM_LBUTTONDOWN

Вопрос прост, у меня есть код, который использует функцию PostMessage, например, так:

public enum WMessages : int
        {
            WM_MOUSEMOVE=                    0x0200,

            WM_LBUTTONDOWN = 0x201,
            WM_LBUTTONUP = 0x202,
            WM_RBUTTONDOWN = 0x0204,
            WM_RBUTTONUP = 0x0205,

            WM_KEYDOWN = 0x100,
            WM_KEYUP = 0x101,

            WH_KEYBOARD_LL = 13,
            WH_MOUSE_LL = 14,
        }
[DllImport("User32.Dll", EntryPoint = "PostMessageA")]
        static extern bool PostMessage(IntPtr hWnd, uint msg, int wParam, int lParam);
        private int MAKELPARAM(int p, int p_2)
        {
            return (p_2 * 0x10000 + p);
        }
        public void SendClick(WMessages type, Point pos, IntPtr hwnd)
        {
            switch (type)
            {
                case WMessages.WM_LBUTTONDOWN:
                    PostMessage(hwnd,
                        (int)0x201, 1,
                        MAKELPARAM(pos.X, pos.Y));//(IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
                    return;
                case WMessages.WM_LBUTTONUP:
                    PostMessage(hwnd,
                        (int)WMessages.WM_LBUTTONUP, 0, // <--(2) but you are telling to do WM_LBUTTONDOWN
                        MAKELPARAM(pos.X, pos.Y));//(IntPtr)((pos.Y << 16) | (pos.X & 0xFFFF)));
                    return;
                default:
                    return;
            }
        }

Единственная проблема в том, что он щелкает не в том месте. Например, если я введу точку 50,50, она щелкнет, например, на 70,70, смещенная к дескриптору окна.

Интересно, почему это происходит? Надеюсь получить ответ.

Заранее спасибо.

Пример:

IntPtr atat = (IntPtr)0x00010870;
SendRClick(WMessages.WM_RBUTTONDOWN, new Point(50, 50), atat);
SendRClick(WMessages.WM_RBUTTONUP, new Point(50, 50), atat);

Редактировать:

Я нашел что-то интересное, по-видимому, это происходит только на 1 из моих экранов (у меня 2), на другом это не происходит.

Экран, в котором это происходит, имеет разрешение 1920/1080, экран, который делает это правильно, имеет разрешение 1280/1024 (мой главный экран, делает это правильно).

Изменить 2:

Также еще одна вещь, которую я забыл упомянуть, это отношение между приведенной точкой к вставленной точке составляет 1,5 в X, а также в Y.

Например, если я ввел X=100,Y=100, это приведет к смещению 150 X и 150 Y относительно дескриптора окна.

Изменить 3:

В качестве альтернативы можно было бы разделить x и y на 1,5, а затем по умолчанию они снова будут умножены... но это не совсем ответ

Изменить 4:

Если это дубликат, тогда дайте мне ссылку на оригинальную ветку.

Изменить 5:

Я решил это. Добавление манифеста не помогло, но потом я узнал этот файл:

https://github.com/Microsoft/WPF-Samples/blob/master/PerMonitorDPI/Developer%20Guide%20-%20Per%20Monitor%20DPI%20-%20WPF%20Preview.docx

Добавляя в файл манифеста эту строку:

<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings"> PerMonitor</dpiAwareness>

в <windowsSettings> область я решил проблему.

0 ответов

Другие вопросы по тегам