关于WM_LBUTTONDOWN

时间:2017-05-28 01:35:12

标签: c# sendmessage window-handles

问题很简单,我有一个使用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);

编辑:

我发现了一些有趣的东西,显然它只发生在我的一个屏幕上(我有2个),而另一个屏幕却没有发生。

它在分辨率下出现的屏幕是1920/1080,正确显示分辨率的屏幕是1280/1024(我的主屏幕,是否正确)。

编辑2:

另外我忘了提到的一点,结果点与插入点之间的比率在X中为1.5,在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 个答案:

没有答案