編輯 - 沒有得到太多的輸入,所以這裏是瘦。我將鍵盤事件發佈到PSN。然後我切換到另一個窗口,發佈更多事件(這次是會話級別)並切換回第一個窗口。當我再次開始發佈到PSN時,沒有任何反應。直到我移動鼠標或滾輪。爲什麼會出現這種情況,我該如何解決它(如果不解決的話)?發佈CGEvent到PSN時發生奇怪的行爲
ORIGINAL - 如果我建立了一個將某些鍵盤事件發佈到PSN的循環,我發現除了首次啓動時它工作正常。只有當我用鼠標手動進行操作時纔會發佈事件 - 即使只是稍微移動一下。如果有幫助,以下是詳情。
外部應用程序有一個文本行列表框,我通過發佈複製命令(並檢查粘貼板)來閱讀。不幸的是,這是我獲得此文本的唯一方法。
有時候,應用程序會將焦點從我可以檢測到的列表中拉出來。發生這種情況時,返回焦點的最可靠方法是發送鼠標事件以單擊列表正上方的文本字段,然後發送「標籤」鍵盤事件以將焦點移到列表中。
所以在啓動時,循環運行良好,滾動列表並複製文本。當焦點移開時,它的檢測效果良好,並且發送事件以將焦點移回列表。但似乎沒有發生。循環繼續檢測焦點已經改變,但事件只有在我移動鼠標時才起作用。甚至只是使用滾輪。奇怪。
第一次發生這種情況時,它可以正常工作 - 每次焦點移動時,PSN事件都會切換回來,而無需執行任何操作。
下面是在循環運行的代碼 - 驗證爲工作:
//copy to pasteboard - CMD-V
e3 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, true);
CGEventSetFlags(e3, kCGEventFlagMaskCommand);
CGEventPostToPSN(&psn, e3);
CFRelease(e3);
e4 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)8, false);
CGEventPostToPSN(&psn, e4);
CFRelease(e4);
//move cursor down
e1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, true);
CGEventPostToPSN(&psn, e1);
CFRelease(e1);
e2 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)125, false);
CGEventPostToPSN(&psn, e2);
CFRelease(e2);
這裏的地方我切換焦點,也工作(當第一次需要時除外):
//click in text input box - point is derived earlier
e6 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseDown, point, 0);
CGEventPostToPSN(&psn, e6);
CFRelease(e6);
e7 = CGEventCreateMouseEvent(NULL, kCGEventLeftMouseUp, point, 0);
CGEventPostToPSN(&psn, e7);
CFRelease(e7);
//press tab key to move to chat log table
CGEventRef e = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, true);
//CGEventPost(kCGSessionEventTap, e);
CGEventPostToPSN(&psn, e);
CFRelease(e);
CGEventRef e11 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)48, false);
CGEventPostToPSN(&psn, e11);
CFRelease(e11);
你如何在窗口之間切換,並且都在同一個應用程序中的窗口? – drawnonward 2010-05-28 03:15:37
這兩個窗口都在同一個應用程序中。我正在使用 AXUIElementSetAttributeValue(myWindow,kAXMainAttribute,kCFBooleanTrue); – 2010-06-01 05:08:14