2010-04-30 47 views
2

我一直在尋找解決辦法,所以我想我會尋找比我更聰明的腦力。我正在開發一個Cocoa應用程序,它使用Accessibility API來操作另一個程序(這是一個熱鍵應用程序)。我所控制的應用通常有多個窗口打開,其中一些隱藏在其他窗口之後。如果可能的話,我想要做的就是使用Accessibility API將鼠標事件發送到窗口,方法是按下窗口中的按鈕而不將其帶到前臺(與窗口交互但不激活它) 。我試圖這樣做的原因是,將鼠標事件發送到其他窗口將強制它到前臺並破壞用戶與最前面的窗口的交互。Cocoa可訪問性API,我可以在後臺單擊一個窗口而不激活它嗎?

這在Windows上是可能的 - 顯然,因爲類似於我的應用程序在那裏做 - 但我覺得這對於Cocoa來說是不可能的,因爲窗口管理器的工作方式。我錯了嗎?

+0

這並不能很好地回答你的問題,但Cocoa中的窗口可以接受鼠標事件而不會成爲前窗。我不確定你會怎麼做,但它應該被記錄下來,我已經看到了應用程序這樣做 - 但如果你不是應用程序接收事件的作者,那是不同於我的想着。 – lucius 2010-05-01 00:36:40

+0

是的,我認爲你可以用NSView accetpsFirstMouse來解決這個問題,但顯然我不能修改另一個應用程序對NSView或NSWindow的使用。 – Winawer 2010-05-01 01:40:05

回答

2

輔助功能比此更高。例如,您發送AXPress動作到AXButton對象,但「按」不一定是點擊按下空格鍵,而視圖是關注的,例如,也是「按」。 AXPress是一個高級別的動作,意思是「做你的事情」,這對某些視圖(如按鈕)顯然有意義,而不是其他人(如字段)。

當您從其預期目的來看時,激活應用程序的輔助功能確實有意義:用於禁用用戶的輔助設備。如果用戶用任何方式「按下」某些東西,他們可能打算激活應用程序並在其中工作。

Quartz Event Services將讓你幾乎有:可以create an event tap for the process you want to control,你可以僞造事件和send them to a tap。當時應用程序已經有一個要處理的事件,那就是you can only send events to a tap when the tap fires。如果沒有,你就卡住了。

相關問題