性格いい人が優勝

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

環境
 WindowsXP
 Visual C++6.0

A 回答 (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と同名のメンバー関数があるので上記のような記述が必要です
    • good
    • 0
この回答へのお礼

ありがとうございます。解決しました。
今日中に終わらせたかったので、本当に感謝です。

ちなみに、
>HWND hWndFore = ::GetForgroundWindow();
'e'が抜けていました。 GetForegroundWindow()
>::SetForground( this->m_hWnd );
'e'と"Window"が抜けていました。 SetForegroundWindow()

ありがとうございました。

お礼日時:2008/11/07 16:42

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 );
}
といった具合で ・・・
    • good
    • 0
この回答へのお礼

早速の回答、ありがとうございます。
まだ初心者の為、そのまま使用させて頂こうとしましたが、以下のエラーが発生しました。

>HWND hWndFore = GetForegroundWindow();
'initializing' : 'class CWnd *' から 'struct HWND__ *' に変換することはできません。

>SetForegroundWindow( this->m_hWnd );
'SetForegroundWindow' : 関数が不正な 1 個の実引数をともなって呼び出されました。

実は投稿前、単純に SetForegroundWindow() を使用しようとして、同じエラーが発生しました。

申し訳ありませんが、再度、助言を頂ければ幸いです。

作成中のソフトの補足です。
メインとなるダイアログはタスクトレイにあり、メッセージウインドウはモードレスダイアログです。

以上、よろしくお願いします。

お礼日時:2008/11/07 16:04

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