
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
反応遅れてしまいすいません。
補足しようと思ったら、サンプルまで書いていただいてしまって(^^;
NOTIFYICONDATAでのタスクへの追加、削除などに関しては問題無かったのですが、PictureBoxやFormを使うやり方、とても参考になりました。
プロセス監視とかのコードはわかりますので、WM_USER定数を調べて自分でやってみようと思います。どうもありがとうございました。
No.2
- 回答日時:
あっすいません。
よく読んだら、メニューが出てないようですね。情報をください。
1.Shell_NotifyIconのパラメータのNOTIFYICONDATA構造体に収めてる各値
2.右クリックで表示したいメニュー名
3_1.メニューの中に「フォームが開く」というコマンドがあった場合は、そのフォームを開く命令を持ったメニュー名
3_2.メニューの中に「フォームが開く」というコマンドがない場合は、開きたいフォーム名
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) office2010とoffice365の共存でoffice365を優先で起草させたい 3 2023/01/24 10:47
- ノートパソコン 【至急】 パソコンでアプリを入れて、「インストール完了」の下に「今すぐ開く」と出たのでクリックしたの 2 2022/11/13 05:06
- アプリ iPhoneのホーム画面上でのアプリ表示数を増やす方法はありますか? 1ページ(スクロール無し)でワ 1 2022/07/16 17:03
- Windows 10 windowsでタスクバーのアイコンをクリックするだけですぐアクティブウィンドウに切り替えられるよう 1 2023/06/11 20:42
- Windows 8 bingのアイコン削除方法 2 2023/03/13 09:31
- デスクトップパソコン windows11のタスクバー登録について 6 2022/12/03 10:55
- デスクトップパソコン デスクトップの表示がおかしい 4 2022/06/20 22:51
- Excel(エクセル) 写真を読んで表示したい。 1 2023/04/20 11:24
- Windows 10 ゲームを起動するとタスクバーにはアイコンが表示されているのですが、最大化出来ません。解決方法を教えて 2 2022/07/22 15:00
- ノートパソコン PCが異常に遅い 12 2023/04/05 14:01
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
VBAでユーザーフォームを再表示...
-
エクセルVBA フォーム上でOnkey...
-
エクセルのチェックボックスの...
-
モードレスでユーザーフォーム...
-
ACCESSのフォーム、開くんです...
-
VBA コンボボックスとテキスト...
-
VB.NETでフォームロード中のエ...
-
VBAでコントロールの数をカウン...
-
EXCEL ユーザーフォームのタイ...
-
VBA フォームに入力された...
-
【VBAユーザーフォームで閉じる...
-
【Excel VBA】ユーザフォームを...
-
Formサイズの最小値
-
EXCEL VBA ユーザーフォームの...
-
ユーザーフォームのコピー?
-
EXCEL Form モードレスで開いて
-
テキストボックスの番号の取得
-
MDI親フォームで子フォーム開放...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
VBAでユーザーフォームを再表示...
-
Form_Load と Form_Activate の...
-
ユーザーフォームのテキストボ...
-
Microsoft Formsの「個人情報や...
-
モーダルフォームとモードレス...
-
クリックイベントなのに、2回ク...
-
ACCESSのフォーム、開くんです...
-
VBA(エクセル)のユーザー...
-
Hideについて(.NET)
-
エクセルVBAのフォームを最...
-
ユーザーフォーム上に現在日時...
-
VB.NETでフォームロード中のエ...
-
(Excel+VBA)ユーザーフォームの...
-
フォームウィンドウを最前面に...
-
アクセス2013 フォームが...
-
コントロールの存在確認
-
Access VBA コントロールの参照...
-
ブックをCloseまたはQuitで閉じ...
おすすめ情報