SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

デスクトップ上のウィンドウをグリッドに沿って合わせるユーティリティ

デスクトップユーティリティ作成のヒント


  • X ポスト
  • このエントリーをはてなブックマークに追加

デスクトップに複数のウィンドウを並べて作業することがありますが、マウス操作では、ぴったりの幅に合わせることができません。そこで、ウィンドウメッセージをフックして、マウス操作が起きた場合に、強制的にウィンドウをグリッドに合わせるツールを作成します。本稿を通じて、デスクトップ操作を改善するユーティリティツール作成のヒントになればと思います。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 デスクトップに複数のウィンドウを並べて作業することがありますが、マウス操作では、なかなかぴったりの幅に合わせることができません。几帳面な性格を持つ多くの人は、これを非常に気持ち悪く感じるはずです。そこで、ウィンドウ同士を気持ちよくぴったり合わせるツールを作成します。このためには、ウィンドウメッセージをフックして、マウス操作が起きた場合に、強制的にウィンドウをグリッドに合わせるようにします。

 Windowsで多くのデスクトップユーティリティが公開されています。ダイアログが表示されると自動的にマウスをダイアログの上に移動させたり、ウィンドウのタイトルをクリックするとウィンドウが透明になったりします。こうしたツールはどうやってデスクトップにあるウィンドウを監視しているのだろうと不思議に思ったことはありませんか。

 これらの動作は、ウィンドウメッセージをフックすることにより実現しています。本稿では、メッセージフックの仕組みを紹介します。デスクトップ操作を改善するユーティリティツール作成のヒントになると思います。

対象読者

  • デスクトップ・ユーティリティを作りたい人
  • イベントフックの仕組みを知りたい人
  • Delphiでオンラインソフトを開発している人

必要な環境

 本稿の開発には、基本的に、Delphi 7を利用します。ただし、Delphi 2005のWin32モードで開いて、問題なくコンパイルできることを確認しています。

今回作成するツールの概要

 今回作成するソフトの原型は、筆者が「窓グリッド」という名前で公開しているフリーソフトです。窓グリッドは以下のURLで公開しています。ウィンドウ同士をぴったりグリッドに沿って並べるツールです。

 窓グリッドから以下のポイントについて解説します。

  • 自分のウィンドウメッセージをフックする方法
  • すべてのウィンドウメッセージをフックする方法
  • ウィンドウのリサイズを検出する方法

イベントのフックについて

 Windowsは、さまざまなメッセージをやりとりしながら動いています。例えば、ユーザーがタスクバーをクリックするなどして、別のアプリケーションに切り替えた場合には、Windowsから対象のウィンドウに対して、WM_ACTIVATEAPPというメッセージが送られます。

 本稿で扱うフックとは、このイベントメッセージを横取りする仕組みです。フック(Hook)とは鉤型の引っ掛けるものを表します。つまり、さまざまなイベントをひっかけて横取りするという意味で使われます。

 では、イベントをフックすると、どんなことができるのでしょうか。フックを利用するには、「SetWindowsHookEx()」という関数を利用して、フック関数をインストールします。MSDNからこの関数のヘルプを調べると、どんなイベントがフックできるのか分かります。以下は、MSDNから引用したC言語の宣言です。

SetWindowsHookExの引数
HHOOK SetWindowsHookEx(
    int idHook,// インストールするフックの種類
    HOOKPROC lpfn,// フックプロシージャのアドレス
    HINSTANCE hMod,// アプリケーションインスタンスのハンドル
    DWORD dwThreadId// フックをインストールするスレッドのID
);

 この1つ目の引数idHookに、フックするイベントの種類を指定します。ウィンドウプロシージャに送られたメッセージを監視する「WH_CALLWNDPROC」や、メッセージキューにポストされたメッセージを監視する「WH_GETMESSAGE」、キーストロークメッセージを監視する「WH_KEYBOARD」など、さまざまな種類のフックができるようになっています。

 今回、ウィンドウの幅をぴったり合わせるのに使うのは、マウスイベントを監視する「WH_MOUSE」です。WH_MOUSEを指定してフック関数をインストールすると、ユーザーがマウスを操作した時のメッセージを取得することができます。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
フックの簡単なサンプル

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

クジラ飛行机(クジラヒコウヅクエ)

ソフト企画「くじらはんど」にて、多数のフリーソフトを公開しています。日本語プログラミング言語「なでしこ」、テキスト音楽「サクラ」、日本語Wiki記法が特徴の「KonaWiki」などを公開しています。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/369 2007/12/10 13:50

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング