• ベストアンサー

ウインドウの最前面表示

指定された日時になると、メッセージウインドウを表示するソフトを作成中ですが、そのウインドウのOnInitDialog()でShowWindow(SW_SHOW)をコールしても、その時に起動しているアプリケーションによっては、最前面に表示されません。(エクスプローラやIEの前面には表示されるが、VC++では背面に表示されます。) アプリケーションによっては無理なのでしょうか? (警告ウインドウとしても使用したいので、最前面に表示したいのですが...。) 環境  WindowsXP  Visual C++6.0

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.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と同名のメンバー関数があるので上記のような記述が必要です

taka077
質問者

お礼

ありがとうございます。解決しました。 今日中に終わらせたかったので、本当に感謝です。 ちなみに、 >HWND hWndFore = ::GetForgroundWindow(); 'e'が抜けていました。 GetForegroundWindow() >::SetForground( this->m_hWnd ); 'e'と"Window"が抜けていました。 SetForegroundWindow() ありがとうございました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

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 ); } といった具合で ・・・

taka077
質問者

お礼

早速の回答、ありがとうございます。 まだ初心者の為、そのまま使用させて頂こうとしましたが、以下のエラーが発生しました。 >HWND hWndFore = GetForegroundWindow(); 'initializing' : 'class CWnd *' から 'struct HWND__ *' に変換することはできません。 >SetForegroundWindow( this->m_hWnd ); 'SetForegroundWindow' : 関数が不正な 1 個の実引数をともなって呼び出されました。 実は投稿前、単純に SetForegroundWindow() を使用しようとして、同じエラーが発生しました。 申し訳ありませんが、再度、助言を頂ければ幸いです。 作成中のソフトの補足です。 メインとなるダイアログはタスクトレイにあり、メッセージウインドウはモードレスダイアログです。 以上、よろしくお願いします。

関連するQ&A