0

我在这里有这段代码可以修改剪贴板,然后将其恢复:

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);在按键被按下之前就被调用了。有没有办法检查何时以及是否按下了按键?

4

1 回答 1

2

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

因为该函数是异步的,所以在其他应用程序开始处理它之前不会处理键盘事件。因此,很可能在您调用时,其他应用程序尚未处理键盘事件SetClipText。除非您可以控制其他应用程序,否则您不能期望知道何时处理特定的键盘事件。但在这种情况下,您不会通过伪造输入与它进行通信。

于 2013-06-08T17:21:58.890 回答