はじめまして。
タスクトレイに常駐するタイプのアプリを作成しています。
操作はすべて、タスクトレイアイコン上から行うので
メインウィンドウを持ちません。
このような場合、ユーザー定義のメッセージを受取るには
どのような手順になるのでしょうか?
宜しくお願いします。
いわゆるメッセージポンプ(GetMessage とかですね。わからなければ
検索してみてください)を作って、送る側で PostThreadMessage を
使えば、NULL の HWND に対してメッセージを送信可能です。
受信専用に ShowWindow(SW_HIDE) なウィンドウを作成しても
いいでしょう。
タスクトレイのアイコンは、オーナーウインドウに関連づけられていますから、表示されてなくてもメインウインドウが存在すると思います。
ダイアログを1つ作成して、WS_VISIBLE スタイルをはずし、次のようにすれば、そんな動きはしますが...。
#include <windows.h>
#include "resource.h" // resource.h とは限らない。
BOOL CALLBACK DialogProc(HWND,UINT,WPARAM,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR cmd,
int state)
{
HWND hDlg;
MSG msg;
NOTIFYICONDATAA nData;
LPCTSTR Tip;
Tip="左クリックで表示、右クリックで終了";
hDlg=CreateDialog(hInstance,MAKEINTRESOURCEA(IDD_DIALOG1),0,DialogProc);
ZeroMemory(&nData,sizeof(NOTIFYICONDATAA));
nData.cbSize=sizeof(NOTIFYICONDATAA);
nData.uID=1;
nData.hWnd=hDlg;
nData.hIcon=LoadIcon(0,IDI_APPLICATION);
lstrcpy(nData.szTip,Tip);
nData.uCallbackMessage=WM_USER+2;
nData.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIconA(NIM_ADD,&nData);
while (GetMessage(&msg,0,0,0))
{
if (!IsDialogMessage(hDlg,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Shell_NotifyIconA(NIM_DELETE,&nData);
return msg.wParam;
}
BOOL CALLBACK DialogProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch (msg)
{
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDCANCEL:
ShowWindow(hDlg,0);
break;;
}
return 1;
case WM_DESTROY:
PostQuitMessage(0);
return 1;
case WM_USER+2:
switch (lParam)
{
case WM_LBUTTONUP:
ShowWindow(hDlg,1);
SetForegroundWindow(hDlg);
break;
case WM_RBUTTONUP:
DestroyWindow(hDlg);
break;
}
return 1;
default:
return 0;
}
}
ただ、もっといい方法があるのかもしれません。
>DotLさん
そういえば、あらためて受信用に作らなくてもHWNDいるはずですね。
こいつのプロシージャで受ければいいだけだった....orz。
何らかの「見えないウィンドウ」は作成する必要がありそうですね。
ありがとうございました。
環境が Win2k 以降なら、まさにそのための「メッセージ専用ウィンドウ」と言う機能があります。
詳しくは CreateWindowEx の説明をご覧ください。