[delphi-users:4627] TTrayIconコンポーネントで左クリックによるポップアップ処理

95 views
Skip to first unread message

ストラテジー鈴木

unread,
Feb 14, 2017, 11:26:07 AM2/14/17
to delphi...@freeml.com
いつもこのメーリングリストを参考にさせていただいております。
鈴木と言います。お知恵をお借りしたく投稿します。

現在、TTrayIconコンポーネントを使用したVCLアプリを作成しています。
TTrayIconの仕様らしく、アイコンをマウスで右クリックしたときにしかポップアップメニューを開くことができません。
マウスの左ボタンでもポップアップメニューを表示したいのですが、何か良い方法はないでしょうか。

現状では、TCustomTrayIconのソース(Vcl.ExtCtrls.pas)のポップアップメニューを表示する処理を真似て、OnMouseUpイベントハンドラで次の様に書いて動作させています。

procedure TMainFrm.TrayIcon1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
SetForegroundWindow(Application.Handle);
Application.ProcessMessages;
LClickPMenu.AutoPopup := False;
LClickPMenu.PopupComponent := Owner;
LClickPMenu.Popup(X,Y);
end
end;


TCustomTrayIconのソースコードでは、WM_SYSTEM_TRAY_MESSAGEとWM_RBUTTONUPメッセージを組み合わせて処理していました。
単純にTTrayIconコンポーネントに対して、マウスの左ボタンを離した時に、SendMessageなどで、右ボタンが離されたメッセージを送信すれば良いかと思ったのですが、Handleプロパティがないため、SendMessageを呼び出せません。また、TControlクラスの派生でもないのでPerformも使えませんでした。

このようなウィンドウハンドルを持たないコンポーネントへメッセージを送るのにはどのようにするのが良いでしょうか。
一応目的の動作は達成しているのですが、何かもっと簡単な方法があるのでは無いかと思い質問させていただきました。

何か良いアイディアがありましたらよろしくお願いします。

[開発環境]
Delphi 10 Seatle
Windows 10 Pro 64bit


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
■即戦力人材と企業をつなぐ転職サイト■
ビズリーチに【無料登録】すると・・・
・一流企業の求人情報を閲覧できます
・ヘッドハンターからスカウトが届きます
ビズリーチ【無料登録】ページはこちら
http://ad.freeml.com/cgi-bin/sa.cgi?id=pFXq2
------------------------------------------------------[freeml byGMO]--

ek

unread,
Feb 14, 2017, 7:19:37 PM2/14/17
to delphi...@freeml.com
ご質問がよくわからずに書いてますが、・・・。
私のコードを調べたら、トレイアイコンコンポの OnMouseUp に以下のように書いています。
ボタンの左右をチェックせずに Popup をすればよいのではないかと思いますが。
参考になりますか。

procedure TFormXXX.TrayIcon1MouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  begin
  if (Button = mbLeft) then begin
    ActionHoge.Execute;
  end
  else
  with PopupMenuTray do begin
    PopupComponent := TrayIcon1;
    Popup(X, Y);
  end;
end;


2017年2月15日 1:26 ストラテジー鈴木 <delphi...@freeml.com>:



--
神谷英一郎

ek

unread,
Feb 14, 2017, 7:22:37 PM2/14/17
to delphi...@freeml.com
追伸 
上記 PopupMenuTray は TPopupMenu です。

--
神谷英一郎

ストラテジー鈴木

unread,
Feb 14, 2017, 8:12:34 PM2/14/17
to delphi...@freeml.com
返信ありがとうございます。鈴木です。
まわりくどい説明で済みません。
次のようなコードで、マウスの左ボタンに反応してポップアップメニューを表示したかったのです。
procedure TMainFrm.TrayIcon1MouseUp(....);
begin
 if Button = mbLeft then
  SendMessage(TrayIcon.Handle,WM_SYSTEM_TRAY_MESSAGEとWM_RBUTTONUP);
 または
 TrayIcon1.Perform(WM_SYSTEM_TRAY_MESSAGE,0,WM_RBUTTONUP);
end

教えていただいたコードを参考にして確認してみました。

 if Button = mbLeft then
 with PopupMenu1 do begin
  PopupComponent := TrayIcon1;
  Popup(X,Y);
 end;

左ボタンに反応してくれました!

ここ数日、TTrayIcon側でなんとかするものだと思って悶悶としていたのですが、TPopupMenuのプロパティを設定することでできるとは考えつきませんでした。
すっきりできました。ありがとうございます。

鈴木


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
あなたの息は大丈夫?
自分の息に自信のないあなたに!!
http://ad.freeml.com/cgi-bin/sa.cgi?id=pFZ5X
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages