4

私が書いているアプリケーション(http://code.google.com/p/blazingstars/issues/detail?id=25)で問題が発生しています。ここで、私のプログラムは、を使用するメニューレット(メニューバー)アプリケーションです。別のプログラムと対話して制御するためのアクセシビリティAPI。API通知の登録や、API呼び出しによるウィンドウリストの取得など、通常のことを行いますが、プログラムが対話している後、プログラムが2番目のスペース(仮想デスクトップ)で開始された場合、少し前に気づきました。 withは最初に開始されますが、ターゲットに関する情報にアクセスできないため、プログラムがクラッシュして書き込みます。(私が見逃しているその問題を回避する方法はありますか?)

簡単な解決策は、正しいスペースでプログラムを再起動するようにユーザーに求めるダイアログをポップアップすることですが、NSWorkspaceまたはAccessibility APIのいずれかを使用して、ターゲットがどのスペースにあるかを判断する方法がわかりません。 、私がいるスペースと比較できるように。何かアイデアはありますか?

コレクションの動作をNSWindowCollectionBehaviorCanJoinAllSpacesに設定しても、起動時に多くの作業を行う必要があるため、何の役にも立ちません。そのため、最初からターゲットと同じスペースにいる必要があります。

4

2 に答える 2

5

のAPIでこれを行うことができると思いますCGWindow.h.
具体的にはとを参照CGWindowListCopyWindowInfo()してくださいkCGWindowWorkspace

私はこれらのAPIを使用して、ウィンドウコンテンツ、ウィンドウフレームなどの取得など、あらゆる種類の処理を実行しました。

それが機能しない場合は、次のプライベートAPIを試してみてください。

 extern CGSError CGSGetWindowWorkspace(const CGSConnectionID cid,
                                       CGSWindowID wid,
                                       CGSWorkspaceID *workspace);

秘訣は、ターゲットプロセスの接続IDを取得することです。

于 2010-01-21T01:03:21.990 に答える
0

おそらく、制御するアプリが現在のスペースに配置されるまで初期化を遅らせるように、アプリを再設計する必要があります。

公式の「スペース変更」通知がないため、Leopardでこれを行う簡単な方法はありませんが、このページのブログ投稿とコメントが役立つ場合があります。

于 2010-01-19T04:21:29.873 に答える