📄 faq77.htm
字号:
<b>if</b><b>(</b>bCapsOn<b>)</b>
<b>{</b>
<font color="navy">// If caps lock is on, we need to press the caps lock</font>
<font color="navy">// and then let go of it to turn it off</font>
keybd_event<b>(</b>VK_CAPITAL<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_CAPITAL<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
<font color="navy">// At this point, we know that caps lock is off, and the</font>
<font color="navy">// shift, ctrl, alt, and other keys have been released</font>
<font color="navy">// Focus the edit control so it receives the key event</font>
Edit1<b>-></b>SetFocus<b>(</b><b>)</b><b>;</b>
<font color="navy">// Simulate the user pressing the A on the keyboard</font>
keybd_event<b>(</b><font color="blue">'A'</font><b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<font color="navy">// Simulate the user releasing the the A on the keyboard</font>
keybd_event<b>(</b><font color="blue">'A'</font><b>,</b> <font color="blue">0</font><b>,</b>KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<font color="navy">// now return the shift, ctrl, capslock, etc to their original state</font>
<b>if</b><b>(</b>bCtrlDown<b>)</b> keybd_event<b>(</b>VK_CONTROL<b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>if</b><b>(</b>bAltDown<b>)</b> keybd_event<b>(</b>VK_MENU<b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>if</b><b>(</b>bShiftDown<b>)</b> keybd_event<b>(</b>VK_SHIFT<b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>if</b><b>(</b>bLWindowsDown<b>)</b> keybd_event<b>(</b>VK_LWIN<b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>if</b><b>(</b>bRWindowsDown<b>)</b> keybd_event<b>(</b>VK_RWIN<b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>if</b><b>(</b>bAppsDown<b>)</b> keybd_event<b>(</b>VK_APPS<b>,</b> <font color="blue">0</font><b>,</b><font color="blue">0</font><b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>if</b><b>(</b>bCapsOn<b>)</b>
<b>{</b>
keybd_event<b>(</b>VK_CAPITAL<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_CAPITAL<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
<b>}</b>
<b>void</b> <b>__fastcall</b> TForm1<b>:</b><b>:</b>Button3Click<b>(</b>TObject <b>*</b>Sender<b>)</b>
<b>{</b>
<font color="navy">// This function toggles the state of the caps lock</font>
keybd_event<b>(</b>VK_CAPITAL<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_CAPITAL<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
<b>void</b> <b>__fastcall</b> TForm1<b>:</b><b>:</b>Button4Click<b>(</b>TObject <b>*</b>Sender<b>)</b>
<b>{</b>
<font color="navy">// This function performs a screen capture of the active</font>
<font color="navy">// window by simulating a press of the print screen key</font>
keybd_event<b>(</b>VK_SNAPSHOT<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_SNAPSHOT<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
<b>void</b> <b>__fastcall</b> TForm1<b>:</b><b>:</b>Button5Click<b>(</b>TObject <b>*</b>Sender<b>)</b>
<b>{</b>
<font color="navy">// This function captures the entire screen to the clipboard</font>
keybd_event<b>(</b>VK_SNAPSHOT<b>,</b> <font color="blue">1</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_SNAPSHOT<b>,</b> <font color="blue">1</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
<b>void</b> <b>__fastcall</b> TForm1<b>:</b><b>:</b>Button6Click<b>(</b>TObject <b>*</b>Sender<b>)</b>
<b>{</b>
<font color="navy">// Here is a cheesy way to tab to the next process by</font>
<font color="navy">// simulating an ALT-TAB event.</font>
keybd_event<b>(</b>VK_MENU<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_TAB<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_TAB<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_MENU<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
<b>void</b> <b>__fastcall</b> TForm1<b>:</b><b>:</b>Button7Click<b>(</b>TObject <b>*</b>Sender<b>)</b>
<b>{</b>
<font color="navy">// This code simulates the Windows + M hotkey for</font>
<font color="navy">// minimizing all open windows.</font>
keybd_event<b>(</b>VK_LWIN<b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b><font color="blue">'M'</font><b>,</b> <font color="blue">0</font><b>,</b> <font color="blue">0</font> <b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b><font color="blue">'M'</font><b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
keybd_event<b>(</b>VK_LWIN<b>,</b> <font color="blue">0</font><b>,</b> KEYEVENTF_KEYUP<b>,</b><font color="blue">0</font><b>)</b><b>;</b>
<b>}</b>
</pre>
<BR>
<H4>
<A NAME="control">Encapsulating keybd_event</A>
</H4>
<P>
The <TT>keybd_event</TT> API function isn't too difficult to understand. However, it might be a good idea to
add a wrapper to <TT>keybd_event</TT>. There are several reasons you might want to do this. For starters,
<TT>keybd_event</TT> looks sort of cryptic, so you might not want to litter your code with <TT>keybd_event</TT>
calls. Secondly, you can really mess up the system if you depress a key, and then forget to release it when you are
done. Encapsulating keybd_event can help prevent this from happening.
</P>
<P>
The Delphi developer support page at the <A HREF="http://www.inprise.com">Inprise website</A> contains an FAQ for
<A HREF="http://www.inprise.com/devsupport/delphi/qanda/FAQ1500D.html">simulating keystrokes</A>.
</P>
<BR>
<H4>
<A NAME="notes">Notes</A>
</H4>
<P>
<B>Note:</B> Due to a limitation in the OS, you cannot use the <TT>keybd_event</TT> function to toggle the num lock
key on a machine that runs Windows 95. It will work on Windows NT.
</P>
<BR>
<TABLE BORDER=1 CELLPADDING=10 CELLSPACING=0 WIDTH="100%">
<TR> <TD colspan = 2><B>Downloads for this FAQ</B> </TD> </TR>
<TR> <TD><TT><A HREF="download/sendkey.zip" >sendkey.zip </A></TT></TD> <TD>BCB3 project that demonstrates how to use <TT>keybd_event</TT> to simulate keystrokes.</TD> </TR>
<TR> <TD><TT><A HREF="download/sendkeyx.zip">sendkeyx.zip</A></TT></TD> <TD>Same as sendkey.zip. Includes an EXE. Download is 138 k.</TD> </TR>
</TABLE>
</TD> </TR>
</TABLE>
</CENTER>
</BODY>
</HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -