[対象バージョン]
Delphi 2.0J, 3.0J
[説明]
タスクトレイに登録されたアイコンにおける右クリックの処理方法です。
[対処法]
○Msgとはメッセージ キューからのメッセージ情報を格納する構造体です。
○メッセージ キューとは処理を待っているメッセージのリストが順番に格納されている場所です。
タスクトレイのアイコンで右クリックをするとメッセージ キューにこのアプリケーションで右クリックされたというWM_RBUTTONDOWN in WM_USER+1 メッセージが書かれます。
(補足:WM_RBUTTONDOWN は WM_USER+1 の追加情報)
アプリケーションは、 自分のスレッドのメッセージ キューにポストされたメッセージを取り出して処理することがOSに義務づけられています。そのためポストされたメッセージをMsgに格納して処理します。
この処理を以下の手続きによって捕捉しWM_USER+1メッセージの時のみ処理します。
procedure TrayEvent(var Msg: TMessage);message WM_USER+1;
WM_USER+1 は Msg.message というところに格納されています。通常はここをcase 文にかけてどのメッセージか判断します。しかし、この場合はすでに WM_USER+1 をDelphiが判断してくれているのでかけなくてOKです。
次は WM_USER+1 の追加情報を調べます。追加情報 WM_RBUTTONDOWN の場合は Msg.LParam に格納されています。それなので Msg.LParam を調べて WM_RBUTTONDOWN が見つかったらそれ用の 処理をします。
処理は
カーソルの現在の位置のスクリーン座標を取得し、
アプリケーションをアクティブにし、
PopupMenuを取得したスクリーン座標に表示する。
というものです。
WM_RBUTTONDOWN を他のメッセージに変えることでダブルクリックなどにも対応できます。
[サンプルソース]
かっとび氏作の参考プログラムソース(Delphi2.0J にて制作されたものですが、Delphi3.1でも問題なくコンパイルできました。)です。