WM_TIMERからポップアップメニューを閉じる方法

このQ&Aのポイント
  • C++にてWin32SDKを使用した開発で、非表示のメインウィンドウでポップアップメニューを表示する際に、一定時間経過後にポップアップメニュー以外をクリックしても消えない場合の解決方法を教えてください。
  • 現在C++で開発を行っており、Win32SDKを使って非表示のメインウィンドウでポップアップメニューを表示させています。しかし、一定時間経過後にポップアップメニュー以外をクリックしてもメニューが消えません。どのようにすれば解決できるでしょうか?
  • C++とWin32SDKを使用して開発を行っています。非表示のメインウィンドウでポップアップメニューを表示する際に、一定時間経過後にポップアップメニュー以外をクリックしても閉じることができません。解決方法を教えてください。
回答を見る
  • ベストアンサー

WM_TIMERからポップアップメニューを閉じるには?

質問させて頂きます。 現在C++にてWin32SDKを使用し開発を行っております そこで、メインウィンドウが非表示の時にもポップアップメニューを表示するようにしているのですが 非表示の際、ホットキーからポップアップメニューを表示すると ポップアップメニュー以外をクリックしても消えますが WM_TIMER等、一定時間経過時に表示した場合 ポップアップメニュー以外をクリックしても消えません WM_HOTKEYでは SetForegroundWindow関数でアクティブにした後に TrackPopupMenu関数でポップアップメニューを表示して 関係ない所をクリックされてもうまく消えます WM_TIMERでもWM_HOTKEYと同じ処理をしても上手くいきません タスクトレイの右クリックと同じく TrackPopupMenu関数の後にWM_NULLをポストしてもメニューは消えません 何か上手く解決出来る方法は無いでしょうか? どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#154655
noname#154655
回答No.2

補足です。 ソースを載せます。 ソースは、「http://wisdom.sakura.ne.jp/system/winapi/win32/win47.html」 を元にさせていただきました。 右クリックでポップアップメニューが出ます。 一定時間何もしないと消えます。 #include <windows.h> #define COUNT_NUMBER 10 //ポップアップメニューカウント数 HMENU hmenu; int menu_count = -1; //ポップアップメニュー消去カウント用 //アイテム追加 bool AddItem(WORD id, char *name) { MENUITEMINFOA information = {sizeof(information)}; information.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE; information.fType = MFT_STRING | MFT_BITMAP; information.wID = id; information.dwTypeData = name; if (InsertMenuItemA(hmenu, id, FALSE, &information) == 0) return (false); return (true); } //ポップアップメニュー表示 BOOL Draw(HWND hwnd) { POINT position; GetCursorPos(&position); return (TrackPopupMenuEx(hmenu, TPM_RETURNCMD, position.x, position.y, hwnd, NULL)); } //ウィンドウプロシージャ LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { HDC hdc; PAINTSTRUCT ps; static BOOL blRight = TRUE; switch (msg) { case WM_DESTROY: DestroyMenu(hmenu); PostQuitMessage(0); return 0; case WM_CREATE: SetTimer(hwnd , 1 , 100 , NULL); hmenu = CreatePopupMenu(); AddItem(1000, "Data1"); AddItem(1001, "Data2"); return 0; //右クリックした時 case WM_RBUTTONDOWN : menu_count = COUNT_NUMBER; Draw(hwnd); return 0; case WM_TIMER: InvalidateRect(hwnd , NULL , TRUE); if (0 == menu_count) { //ポップアップメニュー消去 HWND hwnd_popup = FindWindowA("#32768", NULL); if(hwnd_popup && IsWindowVisible(hwnd_popup)) PostMessage(hwnd_popup, WM_KEYDOWN, VK_ESCAPE, 0); menu_count = -1; } return 0; case WM_PAINT: hdc = BeginPaint(hwnd , &ps); EndPaint(hwnd , &ps); if (0 < menu_count) menu_count--; return 0; } return DefWindowProc(hwnd , msg , wp , lp); } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow ) { HWND hwnd; MSG msg; WNDCLASS winc; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); winc.hCursor = LoadCursor(NULL , IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = "KITTY"; if (!RegisterClass(&winc)) return -1; hwnd = CreateWindow( "KITTY" , "Kitty on your lap" , WS_OVERLAPPEDWINDOW | WS_VISIBLE , 100 , 100 , 300 , 300 , NULL , NULL , hInstance , NULL ); if (hwnd == NULL) return -1; while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg); return 0; } 「閉じない場合がたまにあり~」というのがなぜかは分かりませんが、 消したい時に処理をすればどこでもいいと思います。 何か分からないとこがあれば補足します。

minomino_a
質問者

補足

tyutan様 ソースまで載せて頂き、丁寧なご回答有難うございます。 一定時間経過後に閉じる手法が分かり大変嬉しく思います。 >消したい時に処理をすればどこでもいいと思います 現在消したい時とは、メインウィンドウが非表示で 一定時間の経過により、マウスカーソル位置にポップアップを表示し 無関係な所(デスクトップ画面や他のアプリのウィンドウ)をクリックされたらポップアップを閉じたいと思っています。 WM_INITMENUPOPUPでtyutan様が挙げてご教授頂いた方法でポップアップメニューハンドルを取得し ポップアップメニューをサブクラスにして色々と試して見ましたが(WM_KILLFOCUS時にWM_CLOSEポスト等) まだ望んでいる解決を得られていない現状です。 マウスをフックすれば恐らく解決出来るかと思っておりますが、極力フックは避けて解決したいと思っております もしかするとフックをせずに私が望んでいる方法は出来ないかも知れませんが、もう暫くご回答の程お待ちしております。

その他の回答 (2)

noname#154655
noname#154655
回答No.3

勘違いしていました。 すいません。 ウィンドウ非表示状態で一定時間経過時に表示で、 無関係の所をクリックするとポップアップメニューを消すということでしたね。 こちらでもやってみたのですが出来ませんでした。 予想ですが、デスクトップのメッセージ情報を使用しないといけないのかもしれません。 当方はそのやり方は分からないので答えることは出来ません。 その内容で再度質問されてはどうでしょうか? ちなみに、時間が経つと消す設定にしてみたら出来ました。

minomino_a
質問者

お礼

tyutan様 ご回答有難うございます。 伝わりにくい質問内容で申し訳ありません。 改めて新規に質問させて頂きます。 この度はお付き合い頂き有難うございました。

noname#154655
noname#154655
回答No.1

前にどこかのサイトでサンプルソースを拾ってきたものを そのままコピーしたものです。 HWND hWndPopup = FindWindow( "#32768", NULL ); if( hWndPopup && IsWindowVisible( hWndPopup ) ) { PostMessage( hWndPopup, WM_KEYDOWN, VK_ESCAPE, 0 ); } 一応確認して出来たのでこれでいいと思います。

minomino_a
質問者

補足

tyutan様 ご回答有難うございます。 ご回答頂きました方法を試して見ましたが 閉じない場合がたまにあり、また無関係の所をクリック時にすぐには閉じませんでした 挙げて頂きましたコードはどのタイミングで実行すれば良いでしょうか? 下記は現在試したコードです。 case WM_CREATE: hMenu = CreatePopupMenu( ); AppendMenu( hMenu, MF_STRING, 0x01, TEXT("HOGE1") ); AppendMenu( hMenu, MF_STRING, 0x02, TEXT("HOGE2") ); return 0; case WM_HOTKEY: GetCursorPos( &pos ); SetForegroundWindow( hWnd ); TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hWnd, NULL ); return 0; case WM_TIMER: GetCursorPos( &pos ); SetActiveWindow( hwnd ); SetForegroundWindow( hwnd ); TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hWnd, NULL ); { HWND hWndPopup = FindWindow( "#32768", NULL ); if( hWndPopup && IsWindowVisible( hWndPopup ) ) { PostMessage( hWndPopup, WM_KEYDOWN, VK_ESCAPE, 0 ); } } return 0;

関連するQ&A

  • ウィンドウ非表示に時に表示したポップアップメニューを閉じるには?

    質問させて頂きます。 現在C++にてWin32SDKを使用し開発を行っております そこで、メインウィンドウが非表示の時にポップアップメニューを表示するようにしているのですが 非表示の際、ホットキーを起因にポップアップメニューを表示すると ポップアップメニュー以外をクリックしても消えますが WM_TIMER等、一定時間経過時に表示した場合 ポップアップメニュー以外をクリックしても消えません 下記が一部コードを抜粋した物です case WM_CREATE: hMenu = CreatePopupMenu( ); AppendMenu( hMenu, MF_STRING, 0x01, TEXT("HOGE1") ); AppendMenu( hMenu, MF_STRING, 0x02, TEXT("HOGE2") ); return 0; case WM_HOTKEY: GetCursorPos( &pos ); SetForegroundWindow( hWnd ); TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hWnd, NULL ); return 0; case WM_TIMER: GetCursorPos( &pos ); SetForegroundWindow( hWnd ); TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_BOTTOMALIGN, pos.x, pos.y, 0, hWnd, NULL ); return 0; ホットキーの設定と、タイマーの設定の処理を付随しておりませんが ホットキー、タイマーの処理は同じものです ポップアップメニューを表示の際、WM_INITMENUPOPUPからポップアップメニューをサブクラス化し WM_KILLFOCUS等のメッセージが来た際に破棄する処理を試しても上手く行きません この場合、マウスをグローバルフックしなければならないでしょうか? 極力フックは避けて解決したいと思っております。 ご教授の程よろしくお願いします。

  • ポップアップメニュー

    NotifyIconでタスクバーに呼び出したアイコンの上で右クリックをしたら、ポップアップメニューが表示させるように作りたいのですが、作り方が分かりません。(サイトなどを見たりしました。) 出きれば教えて頂きたいと思います。 *何をしたいのか↓ タスクトレイで表示されたアイコンを右クリックをするとポップアップメニューが出る。 ・環境 Microsoft Visual C++ SDK HINSTANCE hInst; POINT point; static HMENU hMenu,hSubMenu; /////////////////省略/////////////////// case WM_RBUTTONDOWN:  hMenu = LoadMenu(hInst,"MENUDATA");  hSubMenu = GetSubMenu(hMenu,0);  point.x = LOWORD(lParam);  point.y = LOWORD(lParam);  TrackPopupMenu(hSubMenu,TPM_LEFTALIGN,point.x,point.y,0,hWnd,NULL); break; これではうまくいかないのでご助言お願いします。

  • ポップアップメニュー

    ポップアップメニューについて質問させて頂きます。 リストビュー上で右クリックしたときにポップアップメニューを表示させているのですが、このポップアップメニューの項目がクリックされた時のイベントの取り方が分かりません。 ご存知の方、宜しくお願いします。 環境はVisual Studio6.0 Windows2000です

  • ポップアップメニューがおかしいです。

    ポップアップメニューや右クリックメニューが透明に表示されています。見にくくてしょうがありません。だれか助けてください。。。。

  • タスクトレイのポップアップメニュー

    こんにちわ。 タスクトレイにアイコンを登録し、右クリックでポップアップメニューを表示しています。 そのポップアップを表示している状態でデスクトップを左クリックしてもメニューが消えないのはなぜでしょうか?ポップアップされたメニューをクリックしないとメニューが消えてくれません。 何かのイベントでメニューを消す処理をいれておくのでしょうか? どなたか宜しくお願いします。 (VB6 SP5で作成しました。)

  • Dreamwweaverでのポップアップメニュー作成について

    お世話になります。MACOS10,DreamweaverMX2004にてページを作成しております。ビヘイビアからポップアップメニューを作成したいのですが…できません。ポップアップメニューを表示させたいイメージを選択して、ビヘイビアの+をクリック。そこから「ポップアップメニューを表示」を選択すればいいだけなのでしょうが、「ポップアップメニューの非表示」以降の選択肢が薄いグレーの文字色表示で選択ができない状態なのです(選択可能なビヘイビアは黒文字表示)。イメージには無効リンク(Javascript:;)も張っています。なぜ、「ポップアップメニューを表示」が選択できないのでしょうか??

  • ポップアップメニューで

    DreamweaverMX2004で作成しております。 そのなかでポップアップメニューを作成しました。 またFlashのファイルも挿入してあります。 ポップアップメニューがFlashに重なると、 FLASHの下に表示され、メニューが見えない状態です。 FLASHの上に表示することはできないでしょうか? よろしくお願いします。

    • ベストアンサー
    • HTML
  • Dreamweaverでポップアップメニューが・・・

     Dreamweaver8でホームページを作成しているのですが、ポップアップメニューの表示で困っています。  メニューバーにマウスポインタを合わせると下向きにポップアップメニューが表示されるようにしているのですが、メニューバーの下段にはFlashムービーがはりつけてあり、ポップアップメニューがFlashムービーの背面に表示されてしまいます。ポップアップメニューをFlashムービーの前面に表示させるいい方法がありましたら教えてください。  ちなみにポップアップメニューは「ビヘイビア→ポップアップメニューを表示ページ」にて作成。レイアウトはセンター揃えのレイアウトとなっております。  以上、どなたか解決策をご存知の方はよろしくお願いいたします。

    • ベストアンサー
    • CSS
  • Fireworksでポップアップメニュー

    FireworksMXでポップアップメニューを作りDWとかでその下にSWFを入れるとポップアップメニューの上にSWfが表示されてしまいます。 ポップアップの下に表示させていのですが、どなたかわかる方いませんか? 画像だとちゃんと表示できます。教えてください。

  • ポップアップメニュー

    センター寄せのホームページで、プルダウン形式のポップアップメニューを表示したいのですが、なにか解説しているホームページはないでしょうか? 通常、ポップアップメニューを作成する場合には、左上からの絶対座標を指定する形で作成しており、センター寄せでは、できないと言い切っていました。しかし、最近センター寄せのホームページでポップアップメニューのあるものを見てしまったので、実際にはできるのだと思った次第であります。 http://www.cubesystem.co.jp/ 2階層以下のページがセンター寄せのポップアップメニューになってます。

専門家に質問してみよう