- ベストアンサー
タスクバーへアプリの常駐
アプリを起動すると、フォーム等を表示しないでタスクバーにアイコンを表示、常駐する。 そのアイコンがダブルクリックするとフォーム等を開く・・・というアプリを作っています。 API関数で、タスクバーへアイコンを追加、アイコンの削除というのはできたのですが、そのアイコンをダブルクリック(又は、右クリックでメニュー選択)したときフォームが開く、というのが出来ませんでした。 ダブルクリックしたときには、何らかのイベントが動くのでしょうか?それとも、API関数で、それを監視、実行させなくてはならないのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
レスがないので、勝手にサンプルです。 タスクの処理は様々方法がありますが、ばくの知ってるパターンは大きく分けて3つあります。 1.ピクチャボックスのマウスイベントにタスクのイベントを流し込む このサンプルの方法です。サンプルでは、フォーム1のアイコンをピクチャボックスに呼び込み、ピクチャボックスのイベントによって処理を分けています。 2.フォームのマウスイベントにタスクのイベントを流し込む。 このサンプルとほとんど変わらない方法ですが、ダミーの非表示のフォームを使用するのであれば、このような手段をとります。サンプル1よりピクチャボックス一つ分だけEXEが軽くなります。(ほんの数バイトなのですが・・・) 3.NOTIFYICONDATA構造体にWM_USER定数を使用し、プロセス監視を行う。 一番EXEを軽くすることのできる処理ですが、デバッグ途中で止めるとVBが落ちます。プロセス監視が未経験である場合はお奨めしません。 ※必要なもの プロジェクト[Project1] ├フォーム[Form1] │├ピクチャボックス[Picture1] │└メニュー[メニューエディタによる作成:フォーム1のメニュー構造を参照] │ └フォーム[Form2] ※フォーム1のメニュー構造 右クリックメニュー[mnuRight] ├別フォームを開く[mnuRightMenu1] └終了[mnuRightMenu2] 以下のソースをフォーム1に貼り付けてください。 Option Explicit Private Enum TSK_MODE TSK_ADD TSK_DEL TSK_UPDATE End Enum Private Type NOTIFYICONDATA cbSize As Long hwnd As Long uID As Long uFlags As Long uCallbackMessage As Long hIcon As Long szTip As String * 64 End Type Private Const NIM_ADD = &H0 'アイコンを追加 Private Const NIM_DELETE = &H2 'アイコンを削除 Private Const NIM_MODIFY = &H1 'アイコンを変更 Private Const NIF_ICON = &H2 ' Private Const NIF_MESSAGE = &H1 ' Private Const NIF_TIP = &H4 ' Private Const WM_MOUSEMOVE = &H200 'マウスが移動した Private Const WM_LBUTTONDOWN = &H201 '左のマウスボタンを押した Private Const WM_LBUTTONUP = &H202 '左のマウスボタンが解放された Private Const WM_LBUTTONDBLCLK = &H203 '左のマウスボタンをダブルクリックした Private Const WM_RBUTTONDOWN = &H204 '右マウスボタンを押した Private Const WM_RBUTTONUP = &H205 '右マウスボタンを解放した Private Const WM_RBUTTONDBLCLK = &H206 '右のマウスボタンをダブルクリックした Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 'メニュ1(別フォームの表示) Private Sub mnuRightMenu1_Click() Form2.Show End Sub 'メニュ2(終了) Private Sub mnuRightMenu2_Click() Unload Me End End Sub 'タスクトレイピクチャボックスイベント Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) Dim nMessage As Long Dim wkFlg As Boolean Dim i As Long Static DBLCTime As Long ' マウスメッセージの作成 nMessage = x \ Screen.TwipsPerPixelX With Me Select Case nMessage& 'マウスムーブの処理 Case WM_MOUSEMOVE '左ボタンダウン時の処理 Case WM_LBUTTONDOWN '左ボタンアップ時の処理 Case WM_LBUTTONUP '左ボタンダブルクリック時の処理 Case WM_LBUTTONDBLCLK Call mnuRightMenu1_Click '右ボタンダウン時の処理 Case WM_RBUTTONDOWN '右ボタンアップ時の処理 Case WM_RBUTTONUP 'フォーカスがタスクトレイに移るので、自分自身にセットする 'これによりESCキーによるキャンセルが有効になる Call SetForegroundWindow(.hwnd) 'メニューの表示 Call PopupMenu(.mnuRight) '右ボタンダブルクリック時の処理 Case WM_RBUTTONDBLCLK End Select End With PGMEND: End Sub 'フォームロード時の初期設定 Private Sub Form_Load() With Me 'ピクチャボックス非表示 .Picture1.Visible = False 'フォームのアイコンをピクチャボックスに描画 .Picture1.Picture = .Icon 'タスクトレイにアイコン表示 Call IconTray(.Picture1, TSK_ADD, "ツールメッセージ") End With End Sub 'フォーム終了時にタスクトレイアイコン削除 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) With Me Call IconTray(.Picture1, TSK_DEL) End With End Sub 'タスクトレイへのアイコンの追加/変更/削除 Private Sub IconTray(inPcture As PictureBox, dspMode As TSK_MODE, Optional inMsg As String = "") Dim nIcon As NOTIFYICONDATA Dim lngRetValue As Long Dim lngAddDel As Long With nIcon .hwnd = inPcture.hwnd .uID = 0 .cbSize = Len(nIcon) Select Case dspMode Case TSK_ADD, TSK_UPDATE .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE .uCallbackMessage = WM_MOUSEMOVE 'hwndで指定されたオブジェクトハンドルを持つ、マウスムーブイベントにイベントを流す .hIcon = inPcture.Picture .szTip = inMsg & vbNullChar If dspMode = TSK_ADD Then lngAddDel = NIM_ADD ElseIf dspMode = TSK_UPDATE Then lngAddDel = NIM_MODIFY End If Case TSK_DEL lngAddDel = NIM_DELETE End Select lngRetValue = Shell_NotifyIcon(lngAddDel, nIcon) End With End Sub
その他の回答 (2)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
あっすいません。よく読んだら、メニューが出てないようですね。 情報をください。 1.Shell_NotifyIconのパラメータのNOTIFYICONDATA構造体に収めてる各値 2.右クリックで表示したいメニュー名 3_1.メニューの中に「フォームが開く」というコマンドがあった場合は、そのフォームを開く命令を持ったメニュー名 3_2.メニューの中に「フォームが開く」というコマンドがない場合は、開きたいフォーム名
- TAGOSAKU7
- ベストアンサー率65% (276/422)
メニューは表示できてるのですか?
お礼
反応遅れてしまいすいません。 補足しようと思ったら、サンプルまで書いていただいてしまって(^^; NOTIFYICONDATAでのタスクへの追加、削除などに関しては問題無かったのですが、PictureBoxやFormを使うやり方、とても参考になりました。 プロセス監視とかのコードはわかりますので、WM_USER定数を調べて自分でやってみようと思います。どうもありがとうございました。