有办法,只是比较费劲。因为SendMessage只能发单个按键的消息,所以如果要发组合键的消息,就必须修改键盘缓冲区强迫使某一些键处于按下状态(可能描述不当!!!)。BYTE KeyStateArray[256];KeyStateArray[VK_SHIFT] = 0x80; //使SHIFT键处于按下状态
SetKeyboardState(KeyStateArray);SendMessage(hTargetWnd,WM_KEYDOWN,VK_TAB,0); //想窗口发送Shift + TAB 组合键消息KeyStateArray[VK_SHIFT] = 0x00;  //恢复原来的键盘缓冲区
SetKeyboardState(KeyStateArray);

解决方案 »

  1.   

    RegistHotKey()
    UnRegistHotKey()
    API Function.
      

  2.   

    var
       li_key_shift,li_key_tab :intger;
    begin
       li_key_shift := 16;
       li_key_tab  := 9;
       keybd_event(li_key_shift, 0, 0, 0);  //SHIFT按下
       keybd_event(li_key_tab, 0, 0, 0);    //TAB  按下
       keybd_event(li_key_tab, 0, 2, 0);    //TAB  释放
       keybd_event(li_key_shift, 0, 2, 0);  //SHIFT释放
    end;
      

  3.   

    (*//
    标题:模拟系统按键
    说明:支持组合键;不支持部分系统热键(如: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, [ssShift]);
    end;
    ///////End Demo
      

  4.   

    Perform(WM_NEXTDLGCTL, 0, 0); //建议
    Perform(WM_NEXTDLGCTL, 0, -1); //建议