プロが教えるわが家の防犯対策術!

VB6.0にて、自作のアプリ「zisaku.exe」から、タスクトレイ常駐型の他アプリケーション「aiueo.exe」を再起動したいと考えています。
しかし、色々調べて試してみたのですが、Shell_NotifyIconに設定する設定値が分からず困っています。教えていただけないでしょうか。
(「aiueo.exe」はウィンドウを持たない)

動作フロー
(1)「aiueo.exe」のプロセスを削除する。(タスクマネージャにて確認。動作OK)
(2)「aiueo.exe」のタスクトレイアイコンを削除する。(設定値が分からない)
(3)「aiueo.exe」を起動する。(起動後は自動でタスクトレイに入る)

開発環境
WindowsXP SP2 VB6.0-SP6

コード

'タスクトレイ関連の構造体と定数
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
dwState As Long
dwStateMask As Long
End Type

Private Const NIF_ICON = &H2
Private Const NIF_MESSAGE = &H1
Private Const NIF_TIP = &H4

Private Const NIM_ADD = &H0
Private Const NIM_DELETE = &H2
Private Const NIM_MODIFY = &H1

Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205


Private Sub aiueoReStart()

Dim intCnt As Integer
Dim lngRet As Long
Dim strBuf As String
Dim strSql As String
Dim lobjProcess As Object
Dim lstrModule As String

Dim NID As NOTIFYICONDATA

lstrModule = "aiueo.exe"

'プロセスを削除する。
strSql = "SELECT * FROM win32_process WHERE name='" & lstrModule & "'"
For Each lobjProcess In GetObject("winmgmts:").ExecQuery(strSql)
If lstrModule = lobjProcess.Name Then
lobjProcess.Terminate
End If
Next

'Shell_NotifyIconを使ってタスクトレイより削除する。
'NIDの設定値が分からない。
'色々試して見たけど巧くいかなかった。
Shell_NotifyIcon NIM_DELETE, NID

lngRet = Shell("C:\Program Files\aiueo.exe", vbNormalNoFocus)
If lngRet = 0 Then
lngRet = MsgBox("起動失敗!", vbCritical)
End If

Exit Sub
End Sub

以上です。
どうかよろしくお願い致します。

(質問するカテゴリを間違えていたため、一時削除しました。申し訳ありません。)

A 回答 (1件)

タスクトレイって、実体はただのツールバーで、アイコンを登録したウィンドウにメッセージを送っているだけなので、おそらく非表示になっているだけで、aiueo.exe にはウィンドウがあると思います。



Microsoft の Spy++ がインストールされているなら、Spy++ で調べてみるとよいと思います。
Spy++ がなければ、
http://www001.upp.so-net.ne.jp/yamashita/product …
なんかがよさそうです。

ウィンドウクラス名がわかれば、API の FindWindow 関数、もしくは FindWindowEx 関数を使用して、ウィンドウハンドルが取得できます。
で、取得したウィンドウハンドルに SendMessage 関数で WM_DESTROY を送ってやれば、普通のアプリケーションなら、タスクトレイからアイコンを削除して終了すると思います。

もし何か異常な状態になっていて、WM_DESTROY ではアイコンが削除されないのであれば、
Shell_NotifyIcon で削除しなければならないと思いますが、

http://msdn.microsoft.com/en-us/library/bb773352 …

に記載されているように、NOTIFYICONDATA の hWnd と uID の組み合わせ、もしくは、guidItem によって識別しています。ということで、

Dim i As Long
NID.hWnd = FindWindow( "ウィンドウクラス名", "" )
For i = 0 To &HFFFFFFFF
NID.uID = i
If Shell_NotifyIcon( NIM_DELETE, NID ) Then
Exit For
End If
Next

のようにすればよいと思います。

この回答への補足

回答ありがとうございます。
返信が遅くなり申し訳ありません。
急遽出張することになり回答が出来ない状況でした。

了解しました。
早速試してみます。

補足日時:2011/01/17 13:19
    • good
    • 0
この回答へのお礼

色々と試してるうちに遅くなりまして申し訳ありません。
おかげさまで解決する事ができました。ありがとうございます。
ほんと助かりました。

お礼日時:2011/02/03 12:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!