2015-08-09 10 views
7

Ich möchte Schlüsselereignisse überwachen, die einer anderen Anwendung übergeben werden, und wenn Strg + d gedrückt wird, Strg + C senden, den (neuen) Inhalt der Zwischenablage abrufen und abhängig davon weitere Aktionen ausführen.C Zwischenablage sehr langsam aktualisieren

Mein Code:

void PressKeyboardKey(char key){ 
    INPUT ip; 
    ip.type = INPUT_KEYBOARD; 
    ip.ki.wVk = key; 
    ip.ki.wScan = 0; 
    ip.ki.dwFlags = 0; 
    ip.ki.time = 0; 
    ip.ki.dwExtraInfo = 0; 
    SendInput(1, &ip, sizeof(INPUT)); 
    ip.ki.dwFlags = KEYEVENTF_KEYUP; 
    SendInput(1, &ip, sizeof(INPUT)); 
} 

LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){ 
char pressedKey; 
// Declare a pointer to the KBDLLHOOKSTRUCTdsad 
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam; 
switch(wParam) 
{ 
case WM_KEYUP: 
    { 
    pressedKey = (char)pKeyBoard->vkCode; //get the key code 
    if ((pressedKey == -94) || (pressedKey == -93)){ //Ctrl 
     CtrlPressed = FALSE; 
    }else if (pressedKey == 68){ //d 
     if (CtrlPressed && IsTargetApplicationActive()){ 
      PressKeyboardKey(67); //c 
      //Read from Clipboard 
      Sleep(CLIPBOARD_SLEEP_TIME); 
      HANDLE h; 
      if (!OpenClipboard(NULL)){ 
       break; //abort 
      } 
      h = GetClipboardData(CF_TEXT); 
      const char* output = evaluateItem((char*)h); // For now prints the content of the clipboard 
      Sleep(ADDITIONAL_SLEEP_TIME); //Ususally not there, added just for testing 
      CloseClipboard(); 
      ..... 
} 

Wenn CLIPPBOARD_SLEEP_TIME> = 350 (Minimum), alles funktioniert wie erwartet, stark ist die Zeit zu lang für einen guten Workflow. Ansonsten bekomme ich nur den alten Zwischenablage-Inhalt.

Meine erste Vermutung war, dass die Zielanwendung Zwischenablage sehr langsam, aber der folgende ahk Skript füllt:

^d:: 
Send, ^c 
MsgBox, %clipboard% 

Werke scheinbar augenblicklich. Daher muss es einen schnelleren Weg geben, den Inhalt der Zwischenablagen zu erfassen.

Wer weiß, wie man es in C macht - was mache ich falsch?

+3

Tastatureingabe verwenden gepuffert, Sie keine Ahnung genau, wenn der Ziel-App, den Tastendruck aus der Nachrichtenwarteschlange abruft. Es gibt keine vernünftige Obergrenze, es kann * Sekunden * dauern, wenn die App aus dem Speicher ausgelagert wurde. Natürlich tust du es falsch, alles andere ist besser. Nicht beschränkt auf SendMessageTimeout(), um die WM_COPY-Nachricht zu senden und UI Automation zu verwenden. –

+0

Wow, SendMessage funktioniert wirklich Wunder. Mein Grund für SendInput war, dass es DAS Ding ist, das in Google auftaucht, wenn ich nach "send keyboard press c" suche - wusste nicht, dass das so eine schlechte Idee ist. – user2089648

+0

Ich nehme an, das ist Windows. Wäre hilfreich, dieses Keyword hinzuzufügen. – Jeff

Antwort

0

Sie SetClipboardViewer() verwenden müssen, nicht Sleep()