常駐プログラムの作成について

[戻る]
RYU 2006/12/19(火) 23:09:19
度々申し訳ありません。

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

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

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

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

RYU 2006/12/20(水) 14:12:05
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 2006/12/20(水) 14:18:50
メッセージループがないようですが。

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

RYU 2006/12/20(水) 14:35:57
今はアイコンメニューしかないのですがプロシージャは

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 2006/12/20(水) 14:38:56
>メッセージループがない
↓
WinMainにwhile文がないよってことを言っているのですけれども。

RYU 2006/12/20(水) 14:49:22
[[解決]]
Blueさんありがとうございました。解決できました。
while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
}
追加するとできました。

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

古いスレッドには追加発言できません。