2013-06-08 2 views
0

У меня есть этот код прямо здесь, изменяющий буфер обмена, а затем восстанавливает его обратно:Как проверить, успешно ли выполнено keybd_event?

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'а вызывали до нажатия клавиш. Есть ли способ проверить, когда и нажали ли клавиши?

ответ

2

keybd_event никогда не выходит из строя. Он просто помещает их событие в текущую активную очередь ввода.

Поскольку функция асинхронна, событие клавиатуры не обрабатывается до тех пор, пока другое приложение не округляется до его обработки. Таким образом, скорее всего, другое приложение не обработало событие клавиатуры, когда вы вызываете SetClipText. Вы не можете знать, когда обрабатывается конкретное событие клавиатуры, если только вы не контролируете другое приложение. Но в этом случае вы не общались бы с ним, подделывая ввод.

+0

Я слышал/читал о 'SendInput', но я не знаю, как его использовать, не могли бы вы привести пример (с CTRL + V), я думаю, это сработает. –

+1

'SendInput' ничего не меняет. Это просто другой способ синтеза входных событий. –

+0

Я понимаю это сейчас, спасибо. Поэтому мне нужно использовать 'SendMessage', чтобы я мог дождаться его? –