procedure pKeyboardEvent(mKey, mScanCode: Byte; mFlags: Longint); var vKeyboardMsg: TMsg; begin keybd_event(mKey, mScanCode, mFlags, 0); while PeekMessage(vKeyboardMsg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE) do begin TranslateMessage(vKeyboardMsg); DispatchMessage(vKeyboardMsg); end; end;
procedure pSendKeyDown(mKey: Word; mGenUpMsg: Boolean); var vScanCode: Byte; vNumState: Boolean; vKeyBoardState: TKeyboardState; begin if (mKey = VK_NUMLOCK) then begin vNumState := ByteBool(GetKeyState(VK_NUMLOCK) and 1); GetKeyBoardState(vKeyBoardState); if vNumState then vKeyBoardState[VK_NUMLOCK] := (vKeyBoardState[VK_NUMLOCK] and not 1) else vKeyBoardState[VK_NUMLOCK] := (vKeyBoardState[VK_NUMLOCK] or 1);
SetKeyBoardState(vKeyBoardState); Exit; end;
vScanCode := Lo(MapVirtualKey(mKey, 0)); if (mKey in cExtended) then begin pKeyboardEvent(mKey, vScanCode, KEYEVENTF_EXTENDEDKEY); if mGenUpMsg then pKeyboardEvent(mKey, vScanCode, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP) end else begin pKeyboardEvent(mKey, vScanCode, 0); if mGenUpMsg then pKeyboardEvent(mKey, vScanCode, KEYEVENTF_KEYUP); end; end; { pSendKeyDown }
procedure pSendKeyUp(mKey: Word); var vScanCode: Byte; begin vScanCode := Lo(MapVirtualKey(mKey, 0)); if mKey in cExtended then pKeyboardEvent(mKey, vScanCode, KEYEVENTF_EXTENDEDKEY and KEYEVENTF_KEYUP) else pKeyboardEvent(mKey, vScanCode, KEYEVENTF_KEYUP); end;
var I: Integer; begin for I := 1 to mCount do begin if ssShift in mShiftState then pSendKeyDown(VK_SHIFT, False); if ssCtrl in mShiftState then pSendKeyDown(VK_CONTROL, False); if ssAlt in mShiftState then pSendKeyDown(VK_MENU, False); pSendKeyDown(mKey, True); if ssShift in mShiftState then pSendKeyUp(VK_SHIFT); if ssCtrl in mShiftState then pSendKeyUp(VK_CONTROL); if ssAlt in mShiftState then pSendKeyUp(VK_MENU); end; end; 另外一处函数也可以实现类似功能。
Procedure PostKeyEx32( key: Word; Const shift: TShiftState; specialkey: Boolean ); Type TShiftKeyInfo = Record shift: Byte; vkey : Byte; End;
byteset = Set of 0..7; Const shiftkeys: Array [1..3] of TShiftKeyInfo = ((shift: Ord(ssCtrl); vkey: VK_CONTROL ), (shift: Ord(ssShift); vkey: VK_SHIFT ), (shift: Ord(ssAlt); vkey: VK_MENU )); Var flag: DWORD; bShift: ByteSet absolute shift; i: Integer; Begin for i := 1 to 3 Do begin if shiftkeys[i].shift in bShift Then keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), 0, 0); end;
if specialkey then flag := KEYEVENTF_EXTENDEDKEY else flag := 0;
keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 ); flag := flag or KEYEVENTF_KEYUP; keybd_event( key, MapvirtualKey( key, 0 ), flag, 0 );
for i := 3 downto 1 do begin If shiftkeys[i].shift In bShift Then keybd_event( shiftkeys[i].vkey, MapVirtualKey(shiftkeys[i].vkey, 0), KEYEVENTF_KEYUP, 0); end; { For } End;