【发布时间】:2011-10-02 15:45:20
【问题描述】:
我一直在使用SendKeys.Send() & SendKeys.SendWait() 将密钥发送到前台程序(与编写的应用程序不同的程序)。
我尝试通过重复发送相同的键并在它们之间有一定的延迟来发送连续按键,但效果与该应用程序中的连续按键不同。
我的问题是:如何向程序发送连续按键?该按键的效果必须与自己在应用程序中连续按下该键的效果相同。
解决方案编辑
解决办法是调用方法:
[DllImport("User32.dll")]
static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);
使用从以下获得的参数:
public System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("process");
p[0].MainWindowHandle 是 hWnd
并在窗口上使用 Spy:
右键单击 Spy 中的消息行会显示 wMsg、wParam 和 lParam(全部 3 个都是十六进制)
SendMessage(p[0].MainWindowHandle, (uint)0x0100, (UIntPtr)0x00000041, (IntPtr)(0x001E0001));
通过只发送一个 WM_KEYDOWN 消息,效果是连续按下键。要停止程序作为键被连续按下,我必须按下键盘上的那个键并释放它,以便生成 WM_KEYUP。在代码中发送 WM_KEYUP 会给出 System.OverFlow “算术运算导致溢出”。例外。知道为什么会发生这种情况吗?
感谢您的回复:Ation 和 takrl
【问题讨论】:
-
为什么需要这样做?如果您解释一下这是什么需要,也许会有所帮助。
-
为什么有人投票关闭? “如何发送连续按键”是一个完全可以接受的问题。
-
@takrl:我编写了一个基于语音识别向游戏发送命令的程序,现在我想添加一个语音命令向前走,但重复发送键不起作用。这就是为什么我想发送一个连续的按键
-
@Inuyasha:感谢您的支持(我认为 Shippo 同意):) 我真的不明白为什么有人要关闭一个以前没有在这里回答过的有用问题
-
@Inu 我猜它被投票关闭,因为不清楚@Răzvan 到底想做什么。我认为他的评论使这一点更清楚(见我的回答),除非我误解了......