アクセシビリティAPIを使用してウィンドウのサイズを変更するan applicationにパッチを適用しようとしています。OS X上でアクティブなウィンドウを一意に特定
以前のサイズのウィンドウで辞書を維持する必要があります。キーは、現在アクティブなウィンドウを識別する必要があります。現時点では、このアクティブなウィンドウは、ホットキーを押すとNSAccessibilityFocusedWindowAttribute
を介して取得されます。
ただし、このメソッドが呼び出されるたびに、ウィンドウを識別する返されたAXUIElementRef
は異なる!これはもちろん、私は辞書のキーとしてそれを使用することはできません - 辞書は、対応するエントリを見つけることはできませんことを意味します。
次のコードは、問題を再現します。
-(IBAction)testWindowIdentification:(id)sender{
AXUIElementRef focusedApp;
AXUIElementRef focusedWindow;
AXUIElementCopyAttributeValue(_systemWideElement,
(CFStringRef) kAXFocusedApplicationAttribute,
(CFTypeRef*) &focusedApp);
AXUIElementCopyAttributeValue((AXUIElementRef) focusedApp,
(CFStringRef) NSAccessibilityFocusedWindowAttribute,
(CFTypeRef*) &focusedWindow);
CFShow(focusedWindow);
}
_systemWideElement
はAXUIElementCreateSystemWide()
への呼び出しを使用してinit
方法で初期化されています。
CFShow
文が明確に方法が私のために無用である、(同じウィンドウがアクティブであっても)と呼ばれるたびに異なるIDを示しています
<AXUIElement 0x47e850> {pid=42463}
<AXUIElement 0x47e890> {pid=42463}
<AXUIElement 0x47e2c0> {pid=42463}
…
documentation on AXUIElement
はユニークな属性を取得するいかなる方法を示していないがUI要素の場合はthat of the NSAccessibility
protocolのいずれも表示されません。 一意のPIDはではなく、私にとってはではありません。プロセスは複数のウィンドウを持つことができるためです。
Cocoaでアクティブなウィンドウの一意の識別子を取得する方法を教えてください。
(ちなみに、実際のコードは、上記の呼び出しでリターンコードをチェックして、エラーが存在しない、呼び出しが成功します。)
@JeremyBanks元の回答者は正しいアイデアをここに持っています。 [this answer](http://stackoverflow.com/a/312099/517815)を信じるならば、フォーカスされたウィンドウを決めると、実際にはQuartzを使って 'CGWindowID 'を得ることができます。これはあなたが望んでいるユニークなウィンドウ識別子を与えなければなりません。あなたは、現在のアプリケーションの文脈で無事に渡すことができます。実際の答えとしてこれをより一貫して完全なものにしたいのであれば教えてください。 – MrGomez
@MrGomez確かに、そのような答えは素晴らしいでしょう。 :) –
@JeremyBanksになります。私は今日は少しオーバーロードされていますが、私は今晩遅く(PST)これに答えるつもりです。 :) – MrGomez