HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1223
ERSタスクバーのアイコン・右クリックメニュー4解決


ERS

リンク

2013/12/23(Mon) 16:22:29|NO.58853

タスクバーにアイコンを表示させ、そのアイコンを右クリックするとメニューが出るような
処理を組みたいのですが、どのようにすればいいですか。
使う関数名だけでもいいのでよろしくお願いします。



この記事に返信する


あり

リンク

2013/12/23(Mon) 17:07:02|NO.58854

タスクトレイアイコンの処理の事であるなら
『HSP タスクトレイ アイコン』でネット検索すれば
情報とサンプルが見つかります。



774

リンク

2013/12/26(Thu) 00:30:53|NO.58878

恐らく想像以上にめんどくさいです。

user32.dll ・CreatePopupMenu ;メニュー作成 ・InsertMenuItemA ;メニュー項目作成 ・TrackPopupMenu ;メニューをポップアップ表示 ・DestroyMenu ;メニュー破棄 ・CreateIconIndirect ;画像からhIcon作成 ・DestroyIcon ;hIcon破棄 ・SetForegroundWindow gdi32.dll ;画像からhIcon生成の為のアレコレ ・BitBlt ・CreateBitmap ・CreateCompatibleBitmap ・CreateCompatibleDC ・DeleteDC ・DeleteObject ・SetBkColor shell32.dll ・ShellNotifyIconExA ;タスクトレイのアイコン操作 ・ExtractIconExA ;実行ファイルからhIcon抽出 kernel32.dll ・GetModuleFileNameA ;自身の実行ファイル名取得
以下、大雑把な処理の流れです。
1.CreatePopupMenu・InsertMenuItemA 等でメニューを用意します。

2.タスクトレイ用のアイコン(hIcon)を用意します。
gdi32系のAPIで画像から生成、実行ファイルから抽出、
イメージリストを使用する方法などがあります。

3.ShellNotifyIconExA でタスクトレイにアイコンを登録します。
この時の登録ウィンドウに登録したIDのメッセージが送信されます。

4.タスクトレイアイコンが操作されると登録IDのメッセージが送信されます。
この時 lparam に操作内容メッセージが格納されるので、それで操作内容を判断します。
右クリックでメニュー表示ならこんな感じです。

oncmd gosub *tt_Access,$ABCD ;ShellNotifyIconExAでの登録メッセージID ;〜〜〜〜〜〜〜〜 *tt_Access if(lparam==$205){ ;WM_RButtonUp SetForegroundWindow hwnd ;タスクトレイでメニュー表示の際のお呪い TrackPopupMenu hMenu, $180, ginfo.0, ginfo.1, 0, hwnd, 0 cmd = stat ;選択メニュー項目のID取得 ;〜各メニュー項目処理へ〜 } return

5.終了時の後片付け、ShellNotifyIconExA でタスクトレイアイコン撤去
DestroyIcon でアイコン破棄、DestroyMenu でメニューを破棄します。

再利用も考えてモジュール化してしまった方が良いかも知れません。



fortunehill

リンク

2013/12/26(Thu) 01:54:19|NO.58879

/*ご参考*/

#uselib "user32.dll" #func global CreatePopupMenu "CreatePopupMenu" #func global AppendMenuA "AppendMenuA" sptr,sptr,sptr,sptr #func global TrackPopupMenu "TrackPopupMenu" sptr,sptr,sptr,sptr,sptr,sptr,sptr #func global GetClassLongA "GetClassLongA" sptr,sptr #uselib "shell32.dll" #func global Shell_NotifyIconA "Shell_NotifyIconA" sptr,sptr dim nn,122 :ss = "popupmenu","tray" CreatePopupMenu :hh = stat AppendMenuA hh,0,100,ss ; WM_COMMAND ID=100 :nn = 88,hwnd,0,7,$900 ;_TRAYEVENTSTART GetClassLongA hwnd,-14 :nn(5) = stat ; icon(hsp) poke nn,24,ss Shell_NotifyIconA 0,varptr(nn) oncmd gosub *label,$900 ;_TRAYEVENTSTART stop #deffunc xxx onexit :nn = 88,hwnd,0 Shell_NotifyIconA 2,varptr(nn) return *label title str(lparam) if (lparam == 516) {TrackPopupMenu hh,$100,ginfo(0),ginfo(1),0,hwnd,0} return



ERS

リンク

2013/12/26(Thu) 15:29:18|NO.58882

みなさん回答ありがとうございます。
最終的にはサンプル等を参考にしながら774さんのような流れで組みましたが、
最後の SetForegroundWindow hwnd を忘れていたのでメニューが閉じず困っていました。
どうもありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.