• ベストアンサー

指定したアプリケーションを処理が通るときだけモニターの画面の最前面に出したい

お世話になります。 C++6.0 MFCで開発しております。 今、 (1)A.exeのボタンを押すとB.exeを起動(A.exeの上にB.exeが表示) (2)B.exeが終了するとA.exeに終了通知をして、A.exeに処理を戻す。  (A.exeを最前面に表示する) (3)再度A.exeのボタンを押す。  →(1)のときは、A.exeの上にB.exeが表示されていたのに、A.exeの下にB.exeが表示される (2)のA.exeに処理を戻した後、A.exeが最前面に出るように SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE) を実行しています。 (1)、(3)のA.exeのボタンを押すと、A.exeの上にB.exeが表示され、 (2)の時に、A.exeが他のアプリケーションを含めて、最前面、モニターの最前面に表示されるようにしたいのです。 お手数ですがなにとぞよろしくお願いします。 以上よろしくお願いします。

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

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

A.EXEからB.EXEを起動するときに SetWindowPos( hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE ); を実行してから B.EXEを実行してみましょう B.EXEで A.EXEをHWND_TOPMOST指定でアクティブ化されていて これを解除することなく 2回目のB.EXEの起動を行うので質問のような現象になります SetForgroundWindow/AttachThreadInputなどを使う方法もありますよ

kgyqk433
質問者

お礼

ご返事ありがとうございます。 >SetForgroundWindow/AttachThreadInputなどを使う方法もありますよ 調べてがんばってみます!!! ありがとうございます。

その他の回答 (2)

回答No.2

HWND_TOPMOSTは最前面に出すのではなく、最前面を維持する(タスクマネージャのように、他のウィンドウに隠されないようにする)ための指定です。なので、B.exeの画面が後ろに行ってしまうのでしょう。 HWND_TOPではうまくいきませんか? うまくいかない場合、AllowSetForegroundWindowで許可を与えた上で、SetForegroundWindowを使ってみてください。 SetForegroundWindow http://msdn.microsoft.com/ja-jp/library/cc411039.aspx

参考URL:
http://msdn.microsoft.com/ja-jp/library/cc411039.aspx
kgyqk433
質問者

お礼

ご返事ありがとうございます。 >HWND_TOPではうまくいきませんか? うまくいかないのです。。。 >うまくいかない場合、AllowSetForegroundWindowで許可を与えた上で、SetForegroundWindowを使ってみてください。 ありがとうございます。試して見ます

noname#118114
noname#118114
回答No.1

最前面に表示すると言うAPIがあるのでソレを使ってみたらどうでしょうか? (ごめんなさい関数名は思い出せません) 後、処理対象はウィンドウハンドルで指定するので、 他アプリは対象アプリのウィンドウハンドルを取得する必要があります。

kgyqk433
質問者

お礼

ご返事ありがとうございます。 >最前面に表示すると言うAPIがあるのでソレを使ってみたらどうでしょうか? 私ももしや、1行ぐらいで、このアプリの画面を前面に出せ!!見たいな命令があるのかなとおもっていたのですが、うまくいかないのです。。。。 がんばってみます!!ありがとうございます。

関連するQ&A

  • 指定したアプリケーションをモニターの画面の最前面に出したい。

    お世話になります。 C++6.0 MFCで開発しております。 今、 (1)A.exeのボタンを押すとB.exeを起動 (2)B.exeが終了するとA.exeに終了通知をして、A.exeに処理を戻す。 処理をしているのですが、 (2)のA.exeに処理を戻した後、A.exeが最前面に表示されないのです。 A.exe以外にも、Wordやその他のアプリケーションを開いていた場合、 (2)の時点で、モニター上には、A.exeが最前面に表示したいのですが、 Wordやその他のアプリケーションが最前面に表示されます。 お手数ですが、どのようにすれば、他のアプリと同時起動している際に、 A.exeをモニターの最前面に表示できるか教えていただきたく思います。 以上よろしくお願いします。

  • SetWindowPosについて

    こんにちは。以前のスレッドを何件か拝見して、私の事象がないようなので、投稿します。背面フォーム内の処理をタイマ割込みやループなどで処理しつつ、その前面でフォームを表示する場合、SetWindowPosのAPIが有効というところまでは分かっているのですが、私の場合、割り込みによるビットのON/OFFをしたいと思ってロジックを組んでいるのですが・・・ どうしてもモーダルフォームを前面表示したときと同じように、背面での処理が走ってくれません・・・ ロジックですが、前面フォームのイベントを sub Form_Load() SetWindowPos(frm_ctrl.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) end sub のように行っています。アンロード時にハンドルの設定は解除してあります。 タイマ割込みの処理が他者作成のため、目下処理が不明なのですが、こちらの方もAPIを使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。

  • 実行中のプログラムが自分を隠すため

    そうしたい場所で SetWindowPos(hW,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます どうしたら他の1つのプログラムのウィンドウに隠れた状態にする事ができるでしょうか?

  • 非アクティブのウィンドウを最前面に呼び出したい。

    右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、 システムフックをかけてWM_RBUTTONDBLCLKをアプリ側に送り,それに反応させる形でランチャのウィンドウを最前面に持ってきたいのですが上手くいきません。 フックされたメッセージが送られてきた場合の処理は以下のようになっています。 ~省略 case WM_USER+100: //ダブルクリックが送られてきた場合のメッセージコード //任意文字列を別ウィンドウのリストボックスに吐く自作関数 Add("dblclk"); //以下でウィンドウを最前面に持ってくる。 //lpにクリックされた座標が入っている SetWindowPos(hWnd , HWND_TOP,(int)LOWORD(lp),(int)HIWORD(lp), NULL,NULL,SWP_NOSIZE|SWP_SHOWWINDOW); SetForegroundWindow(hWnd); UpdateWindow(hWnd); break; ~省略 このコードの場合、ウィンドウの位置は変更されるのですが、最前面に来てくれません。 Add関数が呼ばれているのでフック自体は成功しているようなのですが、何かおかしな点はありますでしょうか?

  • アクセス2010本体フォーム固定

    アクセス本体のフォームの大きさを固定したく、下記サイトを参考にし http://hatenachips.blog34.fc2.com/blog-entry-2.html SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE 、としました。 これを解除してフォームの大きさを変更できるようにするには、どうしたらよろしいでしょうか?

  • Formをアクティブにする

    バックグラウンド(フォームは非表示にしている)で実行しているプログラムでエラーが発生した場合にサブフォームを表示しています。 このサブフォームを最前面に表示しフォームをアクティブにしたいのですがどのようにすればよろしいでしょうか?(このフォームにはテキストボックス等はなくラベルのみです。) 現在、SetWindowPosにてこのサブフォームのhwndを渡し、HWND_TOPMOSTにしサブフォームにSetFocusさせています。 しかし、実行されると最前面には来るのですがタイトルバーが点滅(?)した状態になりアクティブになりません。このフォームをクリックするとアクティブとなります。 よろしくお願いします。

  • Access2013のコマンドボタンを消す方法

    会社でAccessアプリケーションを作っています。 これまで、Access2003で作っていて、タイトルバーにある閉じるなどのコマンドボタンをモジュールで消していました。モジュールは、下記のような物です。 この度、会社のPCの交換で、Access2013にしたので、古いAccessをコンバートしたいと思いまして、不具合をつぶしているのですが、タイトルバーにあるコマンドボタンを非表示にすることができなくて悩んでいます。 どなたか、Access2013での方法を知っていましたら教えてください。 よろしくお願いします。 Access2003で使っているコードの一部です。 Public Function AccessTitleBar() Const GWL_STYLE = (-16) Const WS_SYSMENU = &H80000 Dim lngRetVal As Long lngRetVal = GetClassLongPtr(hWndAccessApp, GWL_STYLE) lngRetVal = SetWindowLongPt(hWndAccessApp, GWL_STYLE, lngRetVal - WS_SYSMENU) lngRetVal = SetWindowPos(hWndAccessApp, 0, 0, 0, 0, 0, _ SWP_DRAWFRAME Or SWP_NOZORDER Or SWP_NOMOVE Or SWP_NOSIZE) End Function

  • フォームのサイズを変更したいです。

    フォームビューにて、 void CProject2View::OnBnClickedButton1() { this->SetWindowPos(&wndTop,0,0,100,100,SWP_NOMOVE); } とすると、スクロールバーが表示されるだけです。 タイトルのことをするにはどうすればいいですか? よろしくお願いします。

  • ダイアログ最前面表示時の後ろの画面操作について

    はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。

  • PythonでSetWindowPosを使うにはどうしたら良いでしょうか?

    少し前から、Tkinterを使って居りウィンドウを常に最前面に表示したいと思い立ちwin32guiとwin32conと言うモジュールが必要で、インポートするところまで辿り着いたのは良いのですが、その後がよくわかりません。 実験的に from Tkinter import * import win32gui,win32con root = Tk() win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,0,0,200,150,win32con.SWP_SHOWWINDOW) root.mainloop() のようなコードを実行してみたのですが以下のようなエラーメッセージが帰ってきます。 Traceback (most recent call last): File "C:\Documents and Settings\PC USER\デスクトップ\Python\q2.py", line 9, in -toplevel- win32gui.SetWindowPos(root,win32con.HWND_TOPMOST,1,1,100,50,win32con.SWP_SHOWWINDOW) AttributeError: Tk instance has no attribute '__int__' 引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。 私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。