【发布时间】:2020-09-14 19:01:40
【问题描述】:
我正在尝试将组合键发送到另一个类似的程序:
// keydown ctrl
SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_CONTROL, (IntPtr)0x001D0001);
// keydown S
SendMessage(windowBracketsKeyListener, 0x100, (IntPtr)VK_S, (IntPtr)0x001F0001);
SendMessage(windowBracketsKeyListener, 0x102, (IntPtr)115, (IntPtr)0);
// keyup ctrl
SendMessage(windowBracketsKeyListener, 0x101, (IntPtr)VK_CONTROL, (IntPtr)0xC01D0001);
到最后一行我有一个错误(看下图)。
我发送与 Spy++ 相同的命令。所以首先我自动尝试在窗口上单击 CTRL+S 然后检查我在 Spy++ 中得到的内容并编写了相同的命令。
错误:
System.OverflowException: 'Arithmetic operation resulted in an overflow.'
- 好吧,老实说,我使用的不是 Spy++,而是 Window Detective。
【问题讨论】:
-
C# 十六进制文字是有符号的,这可能会导致符号位问题。您可能需要在十六进制值上添加
u后缀,或者使用(IntPtr)unchecked { (uint) 0xhexvalue }来确保不会启动符号扩展。 -
第三行看起来很可疑。您是否要为 S 发送密钥?您在图像中的 cmets 与您所调用的不匹配。难道你不想做:keydown ctrl、keydown s、keyup s、keyup ctrl?完整的异常和堆栈跟踪会很有用。
-
@BenVoigt ,我不确定你的理解是否正确。当我不转换为 IntPtr 时出现错误:“无法从 'uint' 转换为 'System.IntPtr'”
-
@shox ,图像上的代码很脏。第二和第三行有发送“s”键。并且“s”键发送没有问题。正如您在 Window Detective 上看到的一样,但我在第 4 行出现错误。
-
You can't simulate keyboard input with PostMessage(或 SendMessage())
标签: c# winapi window sendkeys sendmessage