//from
http://kingron.myetang.com/zsfunc03.htm(*//
标题:模拟系统按键
说明:支持组合键;不支持部分系统热键(如:Ctrl+Shift+Del...)
设计:Zswang
日期:2002-01-24
支持:[email protected]
//*)///////Begin Source
procedure SendKey(const mKey: Word; mShiftState: TShiftState;
  mCount: Integer = 1); { 模拟系统按键;mCount指定按键次数 }
const
  cExtended: set of Byte = [VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_HOME,
    VK_END, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE];  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; { pKeyboardEvent }  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; { pSendKeyUp }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; { SendKey }
///////End Source///////Begin Demo
procedure TForm1.Button1Click(Sender: TObject);
begin
  SendKey(VK_TAB, [ssAlt]);
end;
///////End Demo

解决方案 »

  1.   

    1
    模拟键盘VOID keybd_event(    BYTE bVk, //按键代码,就象omkeydown里的
        BYTE bScan, // hardware scan code
        DWORD dwFlags, // flags specifying various function options
        DWORD dwExtraInfo  // additional data associated with keystroke
       );
     ParametersbVkSpecifies a virtual-key code. The code must be a value in the range 1 to 254. bScanSpecifies a hardware scan code for the key. dwFlagsA set of flag bits that specify various aspects of function operation. An application can use any combination of the following predefined constant values to set the flags: Value Meaning
    KEYEVENTF_EXTENDEDKEY If specified, the scan code was preceded by a prefix byte having the value 0xE0 (224).
    KEYEVENTF_KEYUP If specified, the key is being released. If not specified, the key is being depressed.
     dwExtraInfoSpecifies an additional 32-bit value associated with the key stroke.  Return ValuesThis function has no return value.