Carbonでプロセスを切り替え

Cocoa, Mac, ソフトウェア Add comments

次のような動作を、ClipMenuで実現しようと思いました。

  1. ブラウザでURL (例: http://www.apple.com/)をクリップボードにコピー。
  2. エディタを起動。
  3. ClipMenuを呼び出して、さっきコピーしたURLを履歴から選び、JavaScriptで記述したアクションを実行。
  4. JavaScript内に書かれた、prompt()メソッドで表示されたダイアローグボックスに、タイトル (例: アップル)を入力。
  5. エディタに、JavaScriptで処理した結果 (例: <a href=”http://www.apple.com/” title=”アップル”>アップル</a>)をペースト。

JavaScript内に、prompt()などの、ウィンドウを表示させるメソッドを使わなければ、特に問題はありませんでした。ただ、クリップボードの文字列と、ユーザー入力の文字列を組み合わせた文字列処理を行いたかったので、いくつかの問題を解決する必要がありました。

最前面に、エディタのウィンドウが表示されている状態で、バックグラウンド専用(LSUIElement = 1)で動いているClipMenuからウィンドウを開くと、最前面にあったエディタのウィンドウの下に表示されてしまいます。

これを避けるために、Cocoaでは以下のメソッドを実行すれば、自分のウィンドウを最前面にすることができました。

[NSApp activateIgnoringOtherApps:YES];

ただ、この後にClipMenuが表示したウィンドウを閉じると、はじめに最前面にあったエディタのウィンドウが一番手前になりますが、フォーカスはあたっていません。そのため、このウィンドウにペーストすることができない状態になってしまいます。

ClipMenuが最前面になる前に、

  1. 最前面のウィンドウのIDを記憶
  2. ClipMenuを最前面に切り替え
  3. ClipMenuのウィンドウを閉じる
  4. さっき記憶したIDのウィンドウを最前面に切り替え

を行えば良さそうだと考えましたが、方法が分かりません。唯一思い浮かんだのは、AppleScriptを使ったものです。ただ、「AppleScriptで解決するのは最後の手段」と、メーリングリストで言っていた人もいたので、やはり他の方法を探すことに。

Xcodeのドキュメントで見当たらなかったため、例によって、Cocoabuilderで検索。見つかった方法は、Carbonの関数を利用するものでした。

» Cocoabuilder - (Edison Thomaz) Bring app to foreground in 10.5

ClipMenuを表示する直前に、GetFrontProcess()関数で記憶したProcessSerialNumberを、ClipMenuを閉じる際に、SetFrontProcess()関数で最前面に設定することで、望み通りの動作をさせることができました。

結構、Carbon APIを使わないと実現できない処理がありますね。

7 Responses to “Carbonでプロセスを切り替え”

  1. tos Says:

    はじめまして。ClipMenu、とても重宝させていただいています。
    ありがとうございます。

    質問なのですが、履歴を消す方法はございますでしょうか。

  2. naotaka Says:

    tosさん、

    履歴の消去機能ですが、現在リリースしているバージョンには、まだ搭載されていません。

    ClipMenuを終了後、

    /Users/<ユーザ名>/ライブラリ/Application Support/ClipMenu/clips.data

    上記のファイルをゴミ箱に捨てれば、すべての履歴を消去できます。

    指定した履歴だけを消去する機能は、開発中のバージョンでは、実装済みです。次バージョンの公開は来月を予定しているので、もうしばらくお待ちいただければと思います。

  3. tos Says:

    ご返答、ありがとうございました。
    個人的にはショートカットで一掃できるような機能があればいいなぁ、、と思いました。
    来月リリースのVer.を楽しみにお待ちしております。^-^

  4. Hiro Says:

    次期バージョンのリリースを心待ちにしております。

    ところで、http://www.naotaka.com/blog/feed/ のフィードがちゃんと動いていないような気がするのは気のせいでしょうか。

  5. naotaka Says:

    うわっ、ホントだ。これはひどい。早速、直しておきました。

    教えていただいて、助かりました。どうも、ありがとうございます!

  6. Hiro Says:

    こちらこそ、直していただいて助かりました。

    ところでここに書くのはふさわしくないかもしれませんが、時期 ClipMenu にプレーンテキストとしてペーストする機能を付けてもらったりはできないでしょうか?テキストの属性(文字の大きさ、色等)を引き継ぎたくないときも少なくないので…。カスタマイズで実現できればそれでも構いません!

  7. naotaka Says:

    はい、次か、その次のバージョンで対応したいと思います。

    一旦、機能の追加を凍結して、リリースをしないと、どんどんリリースが伸びてしまいそうでなので (^^;

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン