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?
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. –
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
Ich nehme an, das ist Windows. Wäre hilfreich, dieses Keyword hinzuzufügen. – Jeff