如何将连续按键发送到程序?

时间:2011-07-11 09:33:21

标签: c# winforms console

我一直在使用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中的消息行显示 wMsg wParam lParam (所有3位十六进制)

SendMessage(p [0] .MainWindowHandle,(uint)0x0100,(UIntPtr)0x00000041,(IntPtr)(0x001E0001));

通过仅发送一条WM_KEYDOWN消息,效果就是连续按下该键。为了停止程序作为键持续按下,我必须按下键盘上的那个键并释放它,以便生成WM_KEYUP。在代码中发送WM_KEYUP会产生System.OverFlow“算术运算导致溢出”。例外。任何想法为什么会发生这种情况?

感谢您的回复:Ation和takrl

2 个答案:

答案 0 :(得分:3)

尝试将Win API SendMessage与WM_KEYDOWN和WM_KEYUP一起使用。应该在此消息之间进行适当的延迟。您也可以使用PostMessage进行异步发送。

[DllImport("User32.dll")]
            public static extern int SendMessage(IntPtr hWnd, uint msg, int wparam, int lparam);

答案 1 :(得分:2)

如果我说得对,你想模仿在应用程序中按键的效果,然后按住它直到操作系统开始重复击键?如果是这样的话,像@Ation建议的API方法是可行的方法。

但是,您应该使用 Spy ++ 等工具分析应用程序收到的内容。对于OS重复的击键,我相信在实际释放密钥之前没有WM_KEYUP。我不认为您可以使用SendKeys.SendSendKEys.SendWait来复制此行为。

修改

以下是间谍++ 日志的摘录,在按下字母TextBox时采用A控件:

<00168> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00173> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00182> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00187> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00196> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00201> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00210> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00215> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00224> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00229> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00238> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00243> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:4 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00252> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00257> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:3 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00266> 00010590 P WM_KEYDOWN nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00271> 00010590 P WM_CHAR chCharCode:'97' (97) cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:0
<00280> 00010590 P WM_KEYUP nVirtKey:'A' cRepeat:1 ScanCode:1E fExtended:0 fAltDown:0 fRepeat:1 fUp:1

正如您所看到的,有几个WM_KEYDOWN后跟WM_CHAR(这可能仅与我用于此的TextBox相关,我不确定),以及最后一个WM_KEYUP。该日志还有其他一些消息,这些消息似乎与按键没有关系(它们是连续编号的),但这可能会因您使用此应用程序或控件而异。

请注意fRepeat:1上的WM_KEYUP以及除第一个之外的所有WM_KEYDOWN,这似乎表示它是自动重复。