度々申し訳ありません。
常駐プログラムを作ろうとしていますが
今 タスクバーに表示させないように
親ウインドウを非表示にしています。
そして子ウインドウのダイアロボックスをメインにしようと思っています。
プログラムを起動すると最初にタスクトレイにはアイコンを表示し、
ダイアロボックスを非表示にしたいと考えています。
WINMAIN関数にタスクトレイへアイコンを表示するコードが書いてありますが
すぐに起動するとアイコンが消えてしまいます。
何かよい方法はないでしょうか よろしくお願いします。
開発環境について毎回必ず書いてください。
貴方の以前の書き込みを読んだ人だけが見るとは限りませんし、
読んだ事がある人でも前の書き込みの内容を覚えているとは
限りませんので。
WinMainと書いてあるので多分、MFC無しのWin32のアプリでは
と思いますけれど、今書かれている内容では何とも言えないと思います。
問題のタスクトレイへのアイコン表示用のコードと言うのを
ここに公開した方が良いと思います。
PATIOさん書き込みありがとうございます。
環境は
OS WINXP
BCC WIN32 SDK で作成しております。
タスクトレイのアイコン表示の関数は
#define MYTRAY_MESSAGE (WM_APP + 1)
NOTIFYICONDATA ni;
WinMainでMyInitNotifyIcon関数を呼び出しており
MyInitNotifyIcon関数は
int MyInitNotifyIcon(HWND hWnd)
{
memset(&ni, 0, sizeof(NOTIFYICONDATA));
ni.cbSize = sizeof(NOTIFYICONDATA);
ni.hWnd = hWnd;
ni.uID = 0;
ni.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
ni.hIcon = (HICON)LoadImage(hInst, MYICON, IMAGE_ICON, 0, 0, 0);
ni.uCallbackMessage = MYTRAY_MESSAGE;
strcpy(ni.szTip, );
Shell_NotifyIcon(NIM_ADD, &ni);
return 0;
}
となっています。
そして WINMAINには
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst,
LPSTR lpszCmdLine, int nCmdShow)
{
HWND hWnd;
MSG msg;
WNDCLASS myProg;
hInst = hInstance;
HINSTANCE hMyInstance = hInstance;
if (!hPreInst) {
myProg.style =0;
myProg.lpfnWndProc =WndProc;
myProg.cbClsExtra =0;
myProg.cbWndExtra =0;
myProg.hInstance =hMyInstance;
myProg.hIcon =NULL;
myProg.hCursor =NULL;
myProg.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH);
myProg.lpszMenuName =NULL;
myProg.lpszClassName =szClassNme;
if (!RegisterClass(&myProg))
return FALSE;
}
hWnd = CreateWindowEx(WS_EX_TOOLWINDOW,
szClassNme,
プログラミング,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hMyInstance,
NULL);
MyInitNotifyIcon(hWnd); //タスクトレイのアイコン表示
return 0;
}
となっています。長くなってすみません。
メッセージループがないようですが。
メッセージループがなければ、そのまま待機することもなく
プログラムは終了しますけど。
今はアイコンメニューしかないのですがプロシージャは
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg) {
case MYTRAY_MESSAGE:
if(wParam == ID_MYTRAY) //アイコンメニュー
{
switch(lParam)
{
case WM_RBUTTONDOWN:
MakeTrayMenu(hWnd);
break;
default:
return(DefWindowProc(hWnd,msg,wParam,lParam));
}
}
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_OUT: //アイコンでのメニュー (表示)
DialogBox(hInst, MYDLG, hWnd, (DLGPROC)MyDlgProc);
break;
case IDM_END: // プログラムの終了
Shell_NotifyIcon(NIM_DELETE, &ni);
DestroyWindow(hWnd);
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}
このようになってます。
?
>メッセージループがない
↓
WinMainにwhile文がないよってことを言っているのですけれども。
Blueさんありがとうございました。解決できました。
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
追加するとできました。
皆様ありがとうございました。