dポイントプレゼントキャンペーン実施中!

Windowsプログラミングでのタスクトレイへの格納について
以下の動作を実現したいです。
(1)初回プログラム起動時タスクトレイにアイコン表示
(2)タスクトレイアイコンのポップアップメニューからプログラムのリージョンウィンドウを表示できる
(3)以後デスクトップとタスクトレイ間で出し入れ可能
Shell_NotifyIcon関数などをつかってプログラム起動後メニューなどからメッセージをつかんで出し入れはできるのですが、初回起動時にタスクトレイに格納しようとするとリージョンウィンドウが表示されたままタスクトレイにアイコンが追加されてしまいます。起動時にタスクトレイのみに表示されるようにする方法分かる方教えてくださいお願いします。

A 回答 (1件)

開発環境が何なのか言語が何なのか MFC を使うのか ATL/WTL を使うのか、いずれも全然書いてないので分かりませんが、C/C++ で Windows API 直叩きならば、WM_WINDOWPOSCHANGING メッセージを処理します。


ウィンドウ プロシージャの LPARAM に WINDOWPOS 構造体へのポインタが渡されるので、ウィンドウを表示するか否かのフラグに応じて

bool g_showWindow = false;

switch (msg)
{
case WM_WINDOWPOSCHANGING:
if (!g_showWindow)
{
WINDOWPOS* lpwndpos = reinterpret_cast<WINDOWPOS*>(lParam);
lpwndpos->flags &= ~SWP_SHOWWINDOW;
lpwndpos->flags |= SWP_HIDEWINDOW;
return 0;
}
break;
}

上記において表示フラグはグローバル変数と仮定して書いてますが、C++ ならば適当にウィンドウ管理クラスのメンバーとかにしといてください。

あとはタスクトレイの NOTIFYICONDATA::uCallbackMessage メンバーに指定したカスタム メッセージのハンドラで、

switch (msg)
{
case (カスタム メッセージ):
switch (lParam)
{
case WM_LBUTTONDOWN:
::SetForegroundWindow(hWnd);
g_showWindow = !g_showWindow;
if (g_showWindow)
{
::ShowWindow(hWnd, SW_SHOWNORMAL);
}
else
{
::ShowWindow(hWnd, SW_HIDE);
}
::PostMessage(hWnd, WM_NULL, 0, 0);
break;
}
return 0;
}

のようにしてフラグとウィンドウ表示状態を切り替えるだけです。

http://msdn.microsoft.com/en-us/library/ms632653 …
http://msdn.microsoft.com/ja-jp/library/xz5c4859 …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!