问题很简单,我有一个使用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>
区域,我解决了这个问题。