如何检查keybd_event是否成功?

时间:2013-06-08 17:10:17

标签: delphi winapi keyboard keystroke

我这里有这个代码修改剪贴板然后恢复它:

function SetClipText(szText:WideString):Boolean;
var
  pData:  DWORD;
  dwSize: DWORD;
begin
  Result := FALSE;
  if OpenClipBoard(0) then
  begin
    dwSize := (Length(szText) * 2) + 2;
    if dwSize <> 0 then
    begin
      pData := GlobalAlloc(MEM_COMMIT, dwSize);
      if pData <> 0 then
      begin
        CopyMemory(Pointer(pData), @szText[1], dwSize - 2);
        if SetClipBoardData(CF_UNICODETEXT, pData) <> 0 then
          Result := TRUE;
      end;
    end;
    CloseClipBoard;
  end;
end;

function GetClipText(var szText:WideString):Boolean;
var
  hData:  DWORD;
  pData:  Pointer;
  dwSize: DWORD;
begin
  Result := FALSE;
  if OpenClipBoard(0) then
  begin
    hData := GetClipBoardData(CF_UNICODETEXT);
    if hData <> 0 then
    begin
      pData := GlobalLock(hData);
      if pData <> nil then
      begin
        dwSize := GlobalSize(hData);
        if dwSize <> 0 then
        begin
          SetLength(szText, (dwSize div 2) - 1);
          CopyMemory(@szText[1], pData, dwSize);
          Result := TRUE;
        end;
        GlobalUnlock(DWORD(pData));
      end;
    end;
    CloseClipBoard;
  end;
end;
var
 OldClip : WideString;
begin
 repeat until GetClipText  (OldClip);
 repeat until SetClipText  ('NewClipBoardText');
 // PASTE
 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
 keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
 keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
 keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0);
 repeat until SetClipText  (OldClip);
end.     

我使用keybd_event将新剪贴板文字粘贴到窗口(例如记事本)。 似乎keybd_event速度非常快,在键被按下之前调用了repeat until SetClipText (OldClip);。有没有办法检查何时以及是否按下按键?

1 个答案:

答案 0 :(得分:2)

keybd_event永远不会失败。它只是将您指定的事件放入当前活动的输入队列中。

因为该函数是异步的,所以在另一个应用程序完成处理之前,不会处理键盘事件。因此,在您致电SetClipText时,其他应用程序很可能尚未处理键盘事件。除非您可以控制其他应用程序,否则您无法知道何时处理特定键盘事件。但在这种情况下,你不会通过伪造输入与它沟通。