• ベストアンサー

ウインドウの最前面表示

指定された日時になると、メッセージウインドウを表示するソフトを作成中ですが、そのウインドウの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

  • ウィンドウ非表示のちらつきを無くすには

    <環境> WIN98 VC++6.0 MFC SDIにて 起動時に下記にてウィンドウを非表示にしていますが、最初に一瞬表示されてから、消えます。 何事も無かったかのように、こっそりと非表示にするにはどうすればよいですか? BOOL CAbcApp::InitInstance() { 省略 //m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->ShowWindow(SW_HIDE); m_pMainWnd->UpdateWindow(); return TRUE; }

  • 非表示のメインウィンドウを表示させるには?

    環境 WIN98 VC++6.0 MFC SDIにて タスクトレイに常駐するアプリにおいて 1.起動時にメインウィンドウを非表示にしています。 2.起動時と同時にダイアログを表示しています。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { 略 dlg = new CInput(this); dlg->Create(IDD_DIALOG1); dlg->ShowWindow(SW_SHOW); return 0; } 3.このような場合に、ダイアログのボタン押し下げにて、メインウィンドウを表示させるには、どうすれば良いでしょうか? 以下のようにしてみましたが、不正な処理で落ちてしまいます。 void CInput::OnButton1() { CWnd* mywnd = (CWnd*)GetParent(); mywnd->ShowWindow(SW_SHOW); }

  • フォームの再表示について

    VC++初心者です。 ダイアログベースのアプリケーションをつくったんですが、その後ボタンクリックでモーダルダイアログを2つ順番に表示したいと思っています。 void CMFC_testDlg::OnBnClickedButton1() {   CmyDialog myDL;   ret1 = myDL.DoModal(); } で一つ目を表示 void CmyDialog::OnBnClickedOk() {   this->ShowWindow(SW_HIDE);   CmyDialog02 myDL02;   myDL02.DoModal(); } で一つ目を隠して、2つ目を表示 さらに2つ目のダイアログのボタンを押した時、2つ目を閉じて1つ目を再表示したいと思います。 void CmyDialog02::OnBnClickedOk() {   EndDialog(-1);   CmyDialog::ShowWindow(SW_SHOW); } と書いた所エラーになります。 どこがまずいんでしょうか。 エラーメッセージ:静的でないメンバ関数の呼び出しが正しくありません VBになれてしまっているため、C++の文法でどう書いていいのかわかりません。 どなたかお教えください。

  • VC++ 7.1 で メインウィンドウを非表示に

    VC++ 7.1 で メインウィンドウを非表示に したいのですが、探し方が悪いのか ShowWindowが見つかりません どのようにして 非表示にしたらいいのでしょうか? よろしくお願いいたします

  • IMEパッドの前面表示について windows7

    IMEパッドを起動すると他のソフトウィンドウの下に隠れるかたちで表示されてしまい使いにくく困っています 例えば、GoogleChromeの検索バーに文字を打ちたくても IMEパッドが起動したGoogleChromeのウィンドウより下に隠れてしまいます 常に最背面に表示されるため IMEパッドを使うにはIMEパッドとGoogleChromeが被らないようにそれぞれの位置とサイズを調整しなければならない状態です 他のソフトと同じく、クリックしたら最前面に出てくるなど時と場合によって背面と前面で使い分けられるようには出来ないのでしょうか? IMEパッドのウィンドウが最背面に表示される以外は問題なく使用できています ご回答よろしくお願いします

  • ダイアログをアクティブにするには?

    よろしくお願い致します。 環境 WIN98 VC++6.0 MFC にて ダイアログを非表示から dlg->ShowWindow(SW_SHOW);にて 表示にしましたが、アクティブ状態になっていません。 アクティブにするにはどうすれば良いですか?

  • バッチ起動でウィンドウアプリを最前面で表示したい

    まず、バッチにてウィンドウアプリを起動する処理を記述し保存します。  例.aaa.bat    C:\Windows\System32\notepad.exe このバッチのショートカットを作成し、ショートカットのプロパティで 「実行時の大きさ」に「最小化」を指定します。 作成したショートカットをダブルクリックしてaaa.batを起動したときには、 DOSプロンプト自体は最小化の状態で起動されますが、 notepad自体は他のウィンドウ(IEでもエクスプローラーでも その他のウィンドウでも何でもよい)がすでにデスクトップ上に 表示されていると、notepadは全てのウィンドウの最背面に 表示されてしまいます。 notepadを最前面で表示したいのですが、最前面に 表示(アクティブ)するためにはどのような対応を 行えばよいのでしょうか? 使用環境はWindows10 Proです。 よろしくご教授お願いいたします。

  • WINDOWを最前面に出したい!!

    WIN32アプリケーションをVC6で作成しています。 複数のウインドウを使用しているのですが、他のウインドウを閉じた瞬間に別のウインドウをアクティブにして、画面の最前面に出したいのですが、どうしたらいいでしょうか? どなたかそのようなことのできるAPI関数をご存知の方がいらしたらお教えください。

  • ダイアログの非表示が遅い

    ダイアログの非表示が遅い Windows CE上で動作するソフトを作成中で、約2cm×2cmほどのボタンだけのダイアログが1つ(メインのダイアログ)、約2cm×1cmほどのボタンだけのダイアログが3つあります。(ダイアログの大きさは、それぞれのボタンと同じサイズで、メイン以外はモーダレスです。) その中の1つを押すと、別の全画面サイズのダイアログを表示し、そのダイアログ上のボタンを押すと、元のボタンだけになるようにしています。 全て、メインのダイアログのOnInitDiarog()で生成しておき、ShowWindow(SW_SHOW)で表示し、ShowWindow(SW_HIDE)で非表示にしているのですが、全画面サイズのダイアログを非表示にする際、表示が消える前に、ボタンのダイアログが表示されてしまい、見た目がかなり悪いのです。 Windows CEは遅いと聞いた事はあるのですが、どうにか対処する方法はないのでしょうか? どなたか助言をお願い致します。 環境は以下の通りです。 ・Windows CE 5.0 ・Visual C++ 2005 ・MFCスマートデバイス 以上、よろしくお願いします。

  • VC++2010ウインドウを常に最前面に表示する

    VC++2010ExpressEditionのフォームアプリケーションにより、簡単な機能のボタンの付いた小さいウインドウを作成しました。 起動した時に、これを常に最前面に配置する方法を教えてください。 いろいろ調べた結果、SetWindowPos を用いればよいことは分かったのですが これを具体的に、どこに書けばいいのか分かりませんでした。 Form1.h の中に書くのでしょうか? その他の場所でしょうか? また、その時の引数のハンドルは、どのように取得するのでしょうか? 基本的なことだと思いますが、インターネットを数時間調べても分からなかったので、質問させて頂きます。 よろしくお願いします。

専門家に質問してみよう