procedure SendKey(const mKey: Word; mShiftState: TShiftState; mCount: Integer = 1); overload;
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 }

解决方案 »

  1.   

    不是啊,是放到一个form里面就跳出个警告,什么也做不了了,不停地在警告,得结束进程才行啊
      

  2.   

    zswang(伴水)(伤心中) :你帖的代码是做什么用的啊
      

  3.   

    可能是2000不支持直接對端口操作asm
        in al, 60h
        mov Key, al
    end;
      
      

  4.   

    按你说是个控件,那就应该保存成一个pas文件,然后用install component去安装,而不是直接用在form里
      

  5.   

    把上面的代码拷贝出来,然后保存成一个pas文件,然后在菜单component中用install component,选择该pas,然后install即可
      

  6.   

    回师傅,我是这么做了,而且把他的active改成false 就没事,不过一改成ture就惨了。
      

  7.   

    错了,是FEnabled := True;这个
      

  8.   

    //你试试看
    SendKey(VK_F4, [ssAlt]);
      

  9.   

    我想大概gwbasic(笑笑)说的是对的。
      

  10.   

    zswang(伴水)(伤心中),你老是帖个sendkey,干什么用的啊?