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新しいクリップボードのテキストをウィンドウ (メモ帳など) に貼り付けるために使用します。キーが押される前にgetが呼び出されるのkeybd_eventはとても速いようです。repeat until SetClipText (OldClip);キーがいつ、どのように押されたかを確認する方法はありますか?

4

1 に答える 1

2

keybd_event決して失敗しません。指定したイベントを現在アクティブな入力キューに配置するだけです。

この関数は非同期であるため、他のアプリケーションが処理を開始するまで、キーボード イベントは処理されません。そのため、 を呼び出すまでに、他のアプリケーションがキーボード イベントを処理していない可能性がありますSetClipText。他のアプリケーションを制御できない限り、特定のキーボード イベントがいつ処理されるかを知ることは期待できません。しかし、その場合、入力を偽って通信することはありません。

于 2013-06-08T17:21:58.890 に答える