- ベストアンサー
ウインドウの最前面表示
指定された日時になると、メッセージウインドウを表示するソフトを作成中ですが、そのウインドウのOnInitDialog()でShowWindow(SW_SHOW)をコールしても、その時に起動しているアプリケーションによっては、最前面に表示されません。(エクスプローラやIEの前面には表示されるが、VC++では背面に表示されます。) アプリケーションによっては無理なのでしょうか? (警告ウインドウとしても使用したいので、最前面に表示したいのですが...。) 環境 WindowsXP Visual C++6.0
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
先の投稿のAPI関数はすべてWinAPIですので スコープ解決演算子『::』を関数の前につけましょう HWND hWndFore = ::GetForgroundWindow(); if ( hWndFore != this->m_hWnd ) { DWORD dwProcessID, dwThreadID; dwThreadID = ::GetWindowThreadProcessId( hWndFore, &dwProcessID ); ::AttachThreadInput( GetCurrentThreadId(), dwThreadID, TRUE ); ::SetForground( this->m_hWnd ); ::AttachThreadInput( GetCurrentThreadId(), dwThreadID, FALSE ); } といった具合です CDialogクラスにもWinAPIと同名のメンバー関数があるので上記のような記述が必要です
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
AttachThreadInputを使って現在のフォアグランドのスレッドに接続しておいてからSetForGroundWindowを実行してみましょう HWND hWndFore = GetForgroundWindow(); if ( hWndFore != this->m_hWnd ) { DWORD dwProcessID, dwThreadID; dwThreadID = GetWindowThreadProcessId( hWndFore, &dwProcessID ); AttachThreadInput( GetCurrentThreadId(), dwThreadID, TRUE ); SetForground( this->m_hWnd ); AttachThreadInput( GetCurrentThreadId(), dwThreadID, FALSE ); } といった具合で ・・・
お礼
早速の回答、ありがとうございます。 まだ初心者の為、そのまま使用させて頂こうとしましたが、以下のエラーが発生しました。 >HWND hWndFore = GetForegroundWindow(); 'initializing' : 'class CWnd *' から 'struct HWND__ *' に変換することはできません。 >SetForegroundWindow( this->m_hWnd ); 'SetForegroundWindow' : 関数が不正な 1 個の実引数をともなって呼び出されました。 実は投稿前、単純に SetForegroundWindow() を使用しようとして、同じエラーが発生しました。 申し訳ありませんが、再度、助言を頂ければ幸いです。 作成中のソフトの補足です。 メインとなるダイアログはタスクトレイにあり、メッセージウインドウはモードレスダイアログです。 以上、よろしくお願いします。
お礼
ありがとうございます。解決しました。 今日中に終わらせたかったので、本当に感謝です。 ちなみに、 >HWND hWndFore = ::GetForgroundWindow(); 'e'が抜けていました。 GetForegroundWindow() >::SetForground( this->m_hWnd ); 'e'と"Window"が抜けていました。 SetForegroundWindow() ありがとうございました。