请如何给一个程序发送组合键消息(如:Ctrl+X)(5分)

  • 主题发起人 主题发起人 PowerVR
  • 开始时间 开始时间
P

PowerVR

Unregistered / Unconfirmed
GUEST, unregistred user!
VOID keybd_event(<br>&nbsp; &nbsp; BYTE bVk, // virtual-key code<br>&nbsp; &nbsp; BYTE bScan, // hardware scan code<br>&nbsp; &nbsp; DWORD dwFlags, // flags specifying various function options<br>&nbsp; &nbsp; DWORD dwExtraInfo // additional data associated with keystroke<br>&nbsp; &nbsp;);<br>keybd_event ( 9, 0, 0 , 0 ) // 按下Tab键<br>keybd_event ( 9, 0, 2, 0 ) // 释放Tab键<br>注意一定要按下和释放成对,否则就麻烦了。<br>
 
利用registerhotkey API
 
解元 朋友的做法只能在那个被发消息的程序处于焦点时才有效,我要的是在非焦点下也有效的!
 
想办法让它获得焦点呀,那就可以了。看过一个例子:自动打开Notepad,然后在里头输入文字,用的就是这种方法——大开后FindWindow获得窗口Handle,再使其获得焦点,就可以模拟输入了。可惜记性不好,具体实现忘了;又比较懒,不愿随便东脑筋,要是你答应把分给我(很需要它),我就研究研究。
 
我的目的就是要在非焦点的时候能够做到,如想像 解元兄 说的那种:(<br>谢谢!
 
postmessage(Handle,WM_KEYDOWN,VK_ALT,0);<br>postmessage(Handle,WM_KEYUP,VK_ALT,0)
 
不要对窗口PostMessage,你可以用PostThreadMessage,当目标程序没有用多线程的时候,<br>不管是否它有输入焦点,它都可以收到。<br>如果在它的窗体上有几个Editbox,你的按键被发到那一个里面就不能确定了。你可以在线<br>程的消息处理函数里面处理这个消息。
 
多谢指点<br>能不能帮我看一段代码<br>&nbsp; &nbsp; h := FindWindow(nil, '我想要的程序');<br>&nbsp; &nbsp; PostThreadMessage(h,WM_KEYDOWN,VK_CONTROL,0);<br>&nbsp; &nbsp; PostThreadMessage(h,WM_KEYDOWN,88,0);<br>&nbsp; &nbsp; PostThreadMessage(h,WM_KEYUP,88,0);<br>&nbsp; &nbsp; PostThreadMessage(h,WM_KEYUP,VK_CONTROL,0);<br>(上面我原来用的是PostMessage)<br>那个程序里有很多Editbox memo listbox之类的东西<br>我在上面的程序中如果只发送一个F10是可以成功的<br>但是象上面那种输入一个Ctrl+x 就不行了:(<br>另外,我这个东东不想让窗口成为焦点<br>我最终的目标还是要把这个窗口隐藏掉<br>然后模拟鼠标和键盘控制这个程序
 
关注中..................
 
没人回丫,再关注一下下<br>高手出来丫
 
你可以在窗体的onkeypress事件中定义<br>if (key=某个值) and (ActiveControl is 某个控件) then<br>begin<br>:<br>end;<br><br>key value:<br>Key_Escape Escape key<br>Key_Tab Tab key<br>Key_Backtab, Key_BackTab Backtab key<br>Key_Backspace, Key_BackSpace Backspace key<br>Key_Return Return key<br>Key_Enter Enter key<br>Key_Insert Insert key<br>Key_Delete Delete key<br>Key_Pause Pause key<br>Key_Print Print key<br>Key_SysReq SysReq key<br>Key_Home Home key<br>Key_End End key<br>Key_Left Left key<br>Key_Up Up key<br><br>Key_Right Right key<br>Key_Down Down key<br>Key_Prior Prior key <br>Key_PageUp Page up key<br>Key_Next Next key<br>Key_PageDown Page down key<br>Key_Shift Shift key<br>Key_Control CTRL key<br>Key_Meta Meta key (often this is the same as the Alt key)<br>Key_Alt Alt key<br>Key_CapsLock Caps Lock key<br>Key_NumLock Num Lock key<br>Key_ScrollLock Scroll Lock key<br>Key_F1 F1 key<br>Key_F2 F2 key<br>Key_F3 F3 key<br>Key_F4 F4 key<br><br>Key_F5 F5 key<br>Key_F6 F6 key<br>Key_F7 F7 key<br>Key_F8 F8 key<br>Key_F9 F9 key<br>Key_F10 F10 key<br>Key_F11 F11 key<br>Key_F12 F12 key<br>Key_F13 F13 key<br>Key_F14 F14 key<br>Key_F15 F1 key<br>Key_F16 F16 key<br>Key_F17 F17 key<br>Key_F18 F18 key<br>Key_F19 F19 key<br>Key_F20 F20 key<br>Key_F21 F21 key<br>Key_F22 F22 key<br>Key_F23 F23 key<br>Key_F24 F24 key<br>Key_F25 F25 key<br>Key_F26 F26 key<br>Key_F27 F27 key<br>Key_F28 F28 key<br>Key_F29 F29 key<br>Key_F30 F30 key<br>Key_F31 F31 key<br>Key_F32 F32 key<br><br>Key_F33 F33 key<br>Key_F34 F34 key<br>Key_F35 F35 key<br>Key_Super_L Super_L key<br>Key_Super_R Super_R key<br>Key_Menu Menu key<br>Key_Hyper_L Hyper_L key<br>Key_Hyper_R Hyper_R key<br>Key_Help Help key<br>Key_Space, Key_Any Space key<br>Key_Exclam Exclamation mark key (!)<br>Key_QuoteDbl Double quotes key( ?)<br>Key_NumberSign Number sign key (#)<br>Key_Dollar Dollar sign key ($)<br>Key_Percent Percent key (%)<br>Key_Ampersand Ampersand key (&amp;)<br><br>Key_Apostrophe Apostrophe key (?<br>Key_ParenLeft Left parenthesis key (<br>Key_ParenRight Right parenthesis key )<br>Key_Asterisk Asterisk key (*)<br>Key_Plus Plus sign key (+)<br>Key_Comma Comma key (,)<br>Key_Minus Minus sign key (-)<br>Key_Period Period key (.)<br>Key_Slash Slash key (/)<br>Key_0 0 key (numeric keypad)<br>Key_1 1 key (numeric keypad)<br>Key_2 2 key (numeric keypad)<br><br>Key_3 3 key (numeric keypad)<br>Key_4 4 key (numeric keypad)<br>Key_5 5 key (numeric keypad)<br>Key_6 6 key (numeric keypad)<br>Key_7 7 key (numeric keypad)<br>Key_8 8 key (numeric keypad)<br>Key_9 9 key (numeric keypad)<br>Key_Colon Colon key (:)<br>Key_Semicolon Semicolon key (;)<br>Key_Less Less than key (&lt;)<br>Key_Equal Equal to key (=)<br>Key_Greater Greater than key (&gt;)<br>Key_Question Question mark key (?)<br><br>Key_At At key @<br>Key_A A key<br>Key_B B key<br>Key_C C key<br>Key_D D key<br>Key_E E key<br>Key_F F key<br>Key_G G key<br>Key_H H key<br>Key_I I key<br>Key_J J key<br>Key_K K key<br>Key_L L key<br>Key_M M key<br>Key_N N key<br>Key_O O key<br>Key_P P key<br>Key_Q Q key<br>Key_R R key<br>Key_S S key<br>Key_T T key<br>Key_U U key<br>Key_V V key<br>Key_W W key<br>Key_X X key<br>Key_Y Y key<br>Key_Z Z key<br>Key_BracketLeft Left bracket key ( [ )<br>Key_Backslash Backslash key (/)<br><br>
 
注册新的系统热键
 
re whitehorse<br>(你可以在窗体的onkeypress事件中定义<br>if (key=某个值) and (ActiveControl is 某个控件) then<br>begin<br>:<br>end;)<br>我看不懂啊,详细说一下好吗?谢谢了<br><br>re stone08,注册系统热键能对另一个程序有效吗?<br>比如我要发送一个F1给IE窗口(而我找不到IE窗口中接收F1这个键的窗口句炳)<br>而且我已经把IE窗口用GOHIDE等软件隐藏起来了(window的状态行看不见)<br>这种情况可以用吗?指点小弟一下,谢谢了
 
窗体的onkeypress事件<br><br>if key=#13 then { 判断是按回车键,也可以是其它键的asc值}<br>if not (ActiveControl is TDbgrid) Then { 焦点不是在TDbgrid控件内进行某一项操作}<br>Begin <br>key:=#0;//清除按键值<br>perform(WM_NEXTDLGCTL,0,0);{移动到下一个控件}<br>end else<br>if (ActiveControl is TDbgrid) Then{是在 TDbgrid 控件内} //如果焦点在dbgride中<br>begin<br>With TDbgrid(ActiveControl) Do<br>if Selectedindex&lt;(FieldCount-1) then<br>Selectedindex:=Selectedindex+1{ 移动到下一字段}<br>else Selectedindex:=0;<br>
 
thank whitehorse<br>能再解释一下上面所做这些的作用吗?<br>是不是循环每一个控件(这些控件是我写的这个程序里的?还是我想控制的程序里的?)<br>当焦点在TDbgrid中时(TDbgrid是什么?)<br>执行<br>With TDbgrid(ActiveControl) Do<br>if Selectedindex&lt;(FieldCount-1) then<br>Selectedindex:=Selectedindex+1{ 移动到下一字段}<br>else Selectedindex:=0;<br>(这一段也没看懂)<br><br>呵呵,不好意思,新手,菜鸟,还望多多指教<br>感激不尽!…
 
作用是如果按键是回车键同等于按Tab键。<br>With TDbgrid(ActiveControl) Do<br>if Selectedindex&lt;(FieldCount-1) then<br>Selectedindex:=Selectedindex+1{ 移动到下一字段}<br>else Selectedindex:=0;<br>如果按回车键时焦点在dbgrid里(Tdbgrid是dbgrid控件的类名)<br>则焦点移到下一列,如果当前列是最后一列则焦点移动下第一列。
 
还是不太明白,是我太笨了:)<br>不好意思再问了,总之谢谢你了:)
 
用系统类型的钩子做吧
 
接受答案了.
 
后退
顶部