判断 Ctrl+N,Ctrl+I 等按键(50分)

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

pyh_jerry

Unregistered / Unconfirmed
GUEST, unregistred user!
如何判断在按下键盘上其它键的同时Ctrl已经按下<br>[:(]为什么我的问题总是得不到我想要的答案,是他们太难了吗?[:(]<br>请随便关心一下这两个问题<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=814281<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=794044
 
这个去查资料比较好,因为这不是技巧的问题
 
onkeydown<br>&nbsp; if ((ssCtrl in Shift) and ((key = ord('i')) or (key = ord('I')) )) then<br>
 
如果在程序之外,可以用HOTKEY
 
ssShift The Shift key is held down.<br>ssAlt The Alt key is held down.<br>ssCtrl The Ctrl key is held down. &nbsp;<br><br>
 
影 子 说的对,正是发向一个非本程序的窗口听消息。比如说 IE <br>不能用onkeydown事件,因此,老赵,hpretty的办法不行[:D]
 
如何判断在按下键盘上其它键的同时Ctrl已经按下<br>如果在窗体事件中如keydown中<br>procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;<br>&nbsp; Shift: TShiftState);<br>begin<br>if ((ssCtrl in Shift) and ((key = ord('i')) or (key = ord('I')) )) then<br>end;<br>就可以了。<br>如果你要监视所有的键盘敲击消息,那么你需要用WINDOWS钩子来获取<br>然后用var j:integer;<br>&nbsp; &nbsp; &nbsp;j:=getkeystate($14); //返回Caps Lock键的状态<br>&nbsp; &nbsp; &nbsp; if ((j and 1)=1 ) &nbsp;then //判断CapsLock是否按下
 
用GetKeyState(VK_Ctrl),看看返回值的最高位是不是1,如果是就说明按下了Ctrl,为0说明没有按下。
 
检测: <br>Var <br>&nbsp; ks: TkeyBoardState; <br>begin <br>&nbsp;GetKeyboardState(ks); <br>&nbsp;if (ks[VK_NUMLOCK] = 1) then <br>&nbsp; &nbsp;ShowMessage('Num Lock is on.') <br>&nbsp;else <br>&nbsp; &nbsp;ShowMessage('Num Lock is off.'); <br>&nbsp;if (ks[VK_CAPITAL] = 1) then <br>&nbsp; &nbsp;ShowMessage('Caps Lock is on.') <br>&nbsp;else <br>&nbsp; &nbsp;ShowMessage('Caps Lock is off.'); <br>end; <br>
 
如何判断最高位是不是1呢?
 
var <br>&nbsp; K: TkeyBoardState; <br>begin <br>&nbsp;GetKeyboardState(K); <br>&nbsp;if (K[VK_Ctrl] = 1) then <br>&nbsp; &nbsp;Ctrl已经按下<br>end;
 
对于窗体上的处理可以用cxx1997的方法,另外,对于全局热键,可以这样做<br>在form.oncreat 事件中登记一个热键<br>hotkeyid:=globaladdatom(pchar('hotkey'))-$c000;<br>registerhotkey(handle,hotkeyid,mod_control,vk_return);//热键为ctrl+enter,其它热键类似<br>定义一个过程<br>procedure wmhotkey(var msg:tmessage);message wm_hotkey;<br>procedure tfrmmain.wmhotkey(var msg:tmessage);<br>begin<br>if (msg.LParamhi=vk_return) and (msg.lparamlo=mod_control) then<br>&nbsp; &nbsp;showmessage('定义了热键ctrl+enter');<br>end;<br>在程序结束的时候释放热键<br>procedure Tfrmmain.FormClose(Sender: TObject; var Action: TCloseAction);<br>begin<br>unregisterhotkey(handle,hotkeyid);<br>deleteatom(hotkeyid);<br>end;<br>
 
判断一个数的某一位是不是1的方法是:(以下数都用二进制表示,括号中为想对应的十进制):<br>例如:要判断(68)的第二位是不是1,那么就把他和01000000(64)(想对应位数为1,其余为0的数)进行按位与(and)运算,<br>如果答案是01000000(64),那么就说明是1,如果不是,就说明是0。该例中说明是(68)<br>的第二位是1。
 
谢谢大家,问题基本解决了
 
后退
顶部