【问题标题】:How can I check if keybd_event was successful?如何检查 keybd_event 是否成功?
【发布时间】:2013-06-04 19:27:01
【问题描述】:

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

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); get。有没有办法检查何时以及是否按下了按键?

【问题讨论】:

    标签: delphi winapi keyboard keystroke


    【解决方案1】:

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

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

    【讨论】:

    • 我听说过/读过SendInput,但我不知道如何使用它,您能否提供一个示例(使用 CTRL+V),我想这会起作用。
    • SendInput 没有任何改变。这只是合成输入事件的另一种方式。
    • 我现在明白了,谢谢。所以我需要使用SendMessage 这样我才能等待?
    • 可以,只要其他应用程序会响应以这种方式传递的输入消息。
    • 现在我没有时间。也许是另一个问题。但是,应该很容易找到数以万计的例子。另外,发送WM_PASTE 消息不是更好吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-31
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多