• ベストアンサー

タスクバーへアプリの常駐

アプリを起動すると、フォーム等を表示しないでタスクバーにアイコンを表示、常駐する。 そのアイコンがダブルクリックするとフォーム等を開く・・・というアプリを作っています。 API関数で、タスクバーへアイコンを追加、アイコンの削除というのはできたのですが、そのアイコンをダブルクリック(又は、右クリックでメニュー選択)したときフォームが開く、というのが出来ませんでした。 ダブルクリックしたときには、何らかのイベントが動くのでしょうか?それとも、API関数で、それを監視、実行させなくてはならないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.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

torokichi
質問者

お礼

反応遅れてしまいすいません。 補足しようと思ったら、サンプルまで書いていただいてしまって(^^; NOTIFYICONDATAでのタスクへの追加、削除などに関しては問題無かったのですが、PictureBoxやFormを使うやり方、とても参考になりました。 プロセス監視とかのコードはわかりますので、WM_USER定数を調べて自分でやってみようと思います。どうもありがとうございました。

その他の回答 (2)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

あっすいません。よく読んだら、メニューが出てないようですね。 情報をください。 1.Shell_NotifyIconのパラメータのNOTIFYICONDATA構造体に収めてる各値 2.右クリックで表示したいメニュー名 3_1.メニューの中に「フォームが開く」というコマンドがあった場合は、そのフォームを開く命令を持ったメニュー名 3_2.メニューの中に「フォームが開く」というコマンドがない場合は、開きたいフォーム名

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

メニューは表示できてるのですか?

関連するQ&A

専門家に質問してみよう