2010-01-22 59 views
5

我想從外部應用程序(例如textedit)將某個窗口設置爲最前面。使用可訪問性API設置最前面的窗口

我可以使用GetFrontProcess成功獲取應用程序本身的引用,並檢查它是否最前面。如果不是,我可以使用setFrontProcess使其集中。

然後我可以使用可訪問性API來檢查該應用程序下的所有窗口。我檢查某個窗口存在,如果是這樣我的應用程序的最窗口比較它與前:

//get the front window of textEditApp and store it in 'currentFrontWindow' 
    AXUIElementCopyAttributeValue(textEditApp, kAXFocusedWindowAttribute, (CFTypeRef *)&currentFrontWindow); 

如果我感興趣的窗口是不是最前面,我需要設置如此。我認爲我可以使用AXUIElement 設置 AttributeValue來做到這一點,但我沒有得到任何成功。以下是我試圖做到這一點的方式。

//set the front window of textEditApp to be desiredFrontWindow 
AXUIElementSetAttributeValue(textEditApp, kAXFocusedUIElementAttribute, desiredFrontWindow); 

我已經檢查了窗口存在,並且應用程序「切換到」成功。但爲什麼這行代碼不會將指定的窗口帶到前面?

謝謝。

回答

8

但是爲什麼這行代碼不會將指定的窗口帶到前面?

因爲您試圖設置只讀屬性。

爲了使窗口最前面,您需要設置窗口的相應屬性。對於應用程序也是如此:要使應用程序處於最前面,您需要設置應用程序的相應屬性。

最前面窗口的Cocoa/Mac OS X名稱是「主窗口」。 (例如,請參見與該概念相關的NSApplication'sNSWindow's methods。)輔助功能使用相同的名稱,因此要將單個窗口設置在最前面,請將其kAXMainAttribute的值設置爲kCFBooleanTrue

使應用程序最前面的方法類似:將其kAXFrontmostAttribute的值設置爲kCFBooleanTrue。您需要執行這兩個操作,以設置應用程序的最前面的窗口並使應用程序處於活動狀態。

據我所知,沒有辦法只帶一個應用程序的最前面的窗口,並給它會話焦點。

+0

感謝(再次)彼得 - 這個工作的魅力。 至於應用程序,我一直在使用setFrontProcess而不是kAXFrontMostAttribute - 這是一個壞主意嗎? 在瀏覽應用程序和窗口的過程中,我有興趣將某些AXUIElementRef放在前面(即賦予其鍵盤焦點)。我可以通過層層元素來獲取對它的引用,但是我如何將它設置爲重點?是否有相當於元素的kAXMainAttribute?也許我應該發佈(還)另一個Q. – 2010-01-22 10:17:40

1

我最近發現,如果您不介意一些碳,您可以使用SetFrontProcessWithOptions將窗口放在前面,如果您傳遞kSetFrontProcessFrontWindowOnly作爲第二個參數,則可以將它放在焦點上。

2

我可以在應用程序I worked on中完成此操作,將應用程序放在前面,然後將單個窗口放在前面。

首先將應用到前面:

let currentPid = NSRunningApplication.currentApplication().processIdentifier 
if let pid = (the pid of the app in question) where pid != currentPid { 
    NSRunningApplication(processIdentifier: pid)?.activateWithOptions(.ActivateIgnoringOtherApps) 
} 

然後發送窗口前:

let window = (window AXUIElement) 
AXUIElementSetAttributeValue(window, NSAccessibilityMainAttribute, true) 
+1

適合我。謝謝。 – 2015-12-20 16:07:24