常駐プログラムの作成について – プログラミング – Home

常駐プログラムの作成について
 
通知
すべてクリア

[解決済] 常駐プログラムの作成について


RYU
 RYU
(@RYU)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

度々申し訳ありません。

常駐プログラムを作ろうとしていますが
今 タスクバーに表示させないように
親ウインドウを非表示にしています。
そして子ウインドウのダイアロボックスをメインにしようと思っています。

プログラムを起動すると最初にタスクトレイにはアイコンを表示し、
ダイアロボックスを非表示にしたいと考えています。
WINMAIN関数にタスクトレイへアイコンを表示するコードが書いてありますが
すぐに起動するとアイコンが消えてしまいます。
何かよい方法はないでしょうか よろしくお願いします。


引用未解決
トピックタグ
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

開発環境について毎回必ず書いてください。
貴方の以前の書き込みを読んだ人だけが見るとは限りませんし、
読んだ事がある人でも前の書き込みの内容を覚えているとは
限りませんので。

WinMainと書いてあるので多分、MFC無しのWin32のアプリでは
と思いますけれど、今書かれている内容では何とも言えないと思います。
問題のタスクトレイへのアイコン表示用のコードと言うのを
ここに公開した方が良いと思います。


返信引用
RYU
 RYU
(@RYU)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

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;
}

となっています。長くなってすみません。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

メッセージループがないようですが。

メッセージループがなければ、そのまま待機することもなく
プログラムは終了しますけど。


返信引用
RYU
 RYU
(@RYU)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

今はアイコンメニューしかないのですがプロシージャは

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);
}

このようになってます。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 


>メッセージループがない

WinMainにwhile文がないよってことを言っているのですけれども。


返信引用
RYU
 RYU
(@RYU)
ゲスト
結合: 18年前
投稿: 15
Topic starter  

Blueさんありがとうございました。解決できました。
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
追加するとできました。

皆様ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました