О 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>
область я решил проблему.