模拟按键按下X秒,UInt32Msg,intwParam,intlParam);publicForm1(){PostMessage(MemoryHandler.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_KEYDOWN,(int)KeyCodes.VKeys.VK_TAB,0);初始化组件();有没有一种方法可以扩展它,以便按键被按下(比如)1秒而不是仅仅单击它?请注意,我对阻塞UI线程的Thread.Sleep()解决方案不感兴趣。按住一个键的同时重复一个键是键盘控制器的一项内置功能。键盘内置微处理器。8042微控制器是传统选择,键盘设备驱动程序仍沿用其名称。所以,不,这不是由Windows完成的,PostMessage()不会为您完成。这个不是问题,可以用Timer模拟一下。如果你想模拟Windows如何处理消息,你可能想看看按键重复率有多快。可以在HKEY_CURRENT_USER控制面板中找到KeyboardKeyboardSpeed。还有KeyboardDelay值。按下某个键时Windows最初发送的是WM_KEYDOWN和WM_CHAR。然后,如果在KeyboardDelay时间跨度后键仍然被按下,WM_KEYDOWN和WM_CHAR对将在每个KeyboardSpeed重复,直到键被按下-此时WM_KEYUP被发送。我建议使用定时器以特定频率发送消息。更新:例如:intkeyboardDelay,keyboardSpeed;使用(varkey=Registry.CurrentUser.OpenSubKey(@"ControlPanelKeyboard")){Debug.Assert(key!=null);键盘延迟=1;int.TryParse((String)key.GetValue("KeyboardDelay","1"),outkeyboardDelay);键盘速度=31;int.TryParse((String)key.GetValue("KeyboardSpeed","31"),outkeyboardSpeed);}maxRepeatedCharacters=30;//重复char30次varstartTimer=newSystem.Windows.Forms.Timer{Interval=keyboardSpeed};startTimer.Tick+=startTimer_Tick;startTimer.Start();varrepeatTimer=newSystem.Windows.Forms.Timer();repeatTimer.Interval+=keyboardDelay;repeatTimer.Tick+=repeatTimer_Tick;//...privatestaticvoidrepeatTimer_Tick(objectsender,EventArgse){PostMessage(MemoryHandler.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_KEYDOWN,(int)KeyCodes.VKeys.VK_TAB,0);PostMessage(MemoryHandler.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_CHAR,(int)KeyCodes.VKeys.VK_TAB,0);计数器++;if(counter>maxRepeatedCharacters){Timertimer=senderasTimer;计时器。停止();}}privatestaticvoidstartTimer_Tick(objectsender,EventArgseventArgs){Timertimer=senderasTimer;计时器。停止();PostMessage(MemoryHandler.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_KEYDOWN,(int)KeyCodes.VKeys.VK_TAB,0);PostMessage(MemoryHandler.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_CHAR,(int)KeyCodes.VKeys.VK_TAB,0);我会在一个线程中执行它以休眠而不阻塞UI线程看到这个:System.Threading.ThreadKeyThread=newSystem.Threading.Thread(()=>{//foreachprocess//presskeynow.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_KEYDOWN,(int)KeyCodes.VKeys.VK_TAB,0);System.Threading.Thread.Sleep(1000);//等待1秒//foreach进程//释放按键再次PostMessage(MemoryHandler.GetMainWindowHandle(),(int)KeyCodes.WMessages.WM_KEYUP,(int)KeyCodes.VKeys.VK_TAB,0);});当然你必须开始它。我不确定你想要实现什么,但下面是我用来模拟使用SendInput输入文本的函数。如果您将其稍微更改为从新线程最后调用SendInput,并使用计时器将down和up事件分开,它是否实现了您的需要?[DllImport("user32.dll",SetLastError=true)]staticexternUInt32SendInput(UInt32numberOfInputs,INPUT[]inputs,Int32sizeOfInputStructure);publicenumInputType:uint{MOUSE=0,KEYBOARD=1,HARD}WARE=2,structINPUT{publicUInt32Type;公共MOUSEKEYBDHARDWAREINPUT数据;}structKEYBDINPUT{publicUInt16Vk;公共UInt16扫描;公共UInt32标志;公共UInt32时间;公共IntPtr额外信息;}publicenumKeyboardFlag:uint//UInt32{EXTENDEDKEY=0x0001,KEYUP=0x0002,UNICODE=0x0004,SCANCODE=0x0008,}publicstaticvoidSimulateTextEntry(stringtext){if(text.Length>UInt32.MaxValue/2)thrownewArgumentException(string.Format("文本参数太长,必须少于{0}个字符。",UInt32.MaxValue/2),"text");varchars=UTF8Encoding.ASCII.GetBytes(文本);varlen=chars.Length;INPUT[]inputList=newINPUT[len*2];对于(整数x=0;x不确定你在用PostMessage做什么,但从这里修改了一些代码:SendKey.Send()notworking[DllImport("user32.dll",SetLastError=true)]staticexternvoidkeybd_event(bytebVk,bytebScan,uintdwFlags,UIntPtrdwExtraInfo);publicstaticvoidPressKey(Keyskey,boolup){constintKEYEVENTF_EXTENDEDKEY=0x1;constintKEYEVENTF_KEYUP=0x2;if(up){keybd_event((byte)key,0x45,KEYEVENTF_KEYUP,(UIntPtr)0);}else{keybd_event((byte)key,0x45,KEYEVENTF_EXTENDEDKEY,(UIntPtr)0);}}voidTestProc(){PressKey(Keys.Tab,false);线程.睡眠(1000);PressKey(Keys.Tab,true);也许这对你有用它只是按下一个键,然后在key和之间休眠。您甚至可以进一步添加它并传递一个时间值,指示您希望密钥保留多长时间。当按下物理键盘上的某个键时,重复的击键将传递到活动窗口。这不是键盘内置的,而是Windows的一项功能。您可以执行以下步骤来模拟这个操作:以上就是《C#学习教程:X秒模拟按钮》的全部内容。如果对大家有用,需要进一步了解《C#学习教程》,希望大家多多关注---发送keydown消息。以30毫秒的间隔运行计时器(Windows中的默认设置,可以通过轻松访问设置更改),每次勾选时向窗口发送按键消息。发送关键信息。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
