メインウィンドウのないアプリでメッセージを受取るには?

解決


ふらみんご  2004-11-08 03:34:40  No: 55011  IP: [192.*.*.*]

はじめまして。
タスクトレイに常駐するタイプのアプリを作成しています。
操作はすべて、タスクトレイアイコン上から行うので
メインウィンドウを持ちません。
このような場合、ユーザー定義のメッセージを受取るには
どのような手順になるのでしょうか?
宜しくお願いします。

編集    削除
Ban  2004-11-08 06:35:17  No: 55012  IP: [192.*.*.*]

いわゆるメッセージポンプ(GetMessage とかですね。わからなければ
検索してみてください)を作って、送る側で PostThreadMessage を
使えば、NULL の HWND に対してメッセージを送信可能です。

受信専用に ShowWindow(SW_HIDE) なウィンドウを作成しても
いいでしょう。

編集    削除
DotL  2004-11-08 07:26:12  No: 55013  IP: [192.*.*.*]

タスクトレイのアイコンは、オーナーウインドウに関連づけられていますから、表示されてなくてもメインウインドウが存在すると思います。

ダイアログを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;
  }
}

ただ、もっといい方法があるのかもしれません。

編集    削除
Ban  2004-11-08 08:11:08  No: 55014  IP: [192.*.*.*]

>DotLさん

そういえば、あらためて受信用に作らなくてもHWNDいるはずですね。
こいつのプロシージャで受ければいいだけだった....orz。

編集    削除
ふらみんご  2004-11-08 12:55:08  No: 55015  IP: [192.*.*.*]

何らかの「見えないウィンドウ」は作成する必要がありそうですね。
ありがとうございました。

編集    削除
シャノン  2004-11-08 18:40:13  No: 55016  IP: [192.*.*.*]

環境が Win2k 以降なら、まさにそのための「メッセージ専用ウィンドウ」と言う機能があります。
詳しくは CreateWindowEx の説明をご覧ください。

編集    削除