- ベストアンサー
指定したアプリケーションを処理が通るときだけモニターの画面の最前面に出したい
お世話になります。 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が他のアプリケーションを含めて、最前面、モニターの最前面に表示されるようにしたいのです。 お手数ですがなにとぞよろしくお願いします。 以上よろしくお願いします。
- kgyqk433
- お礼率27% (220/805)
- C・C++・C#
- 回答数3
- ありがとう数3
- みんなの回答 (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などを使う方法もありますよ
その他の回答 (2)
- m-take0220
- ベストアンサー率61% (474/777)
HWND_TOPMOSTは最前面に出すのではなく、最前面を維持する(タスクマネージャのように、他のウィンドウに隠されないようにする)ための指定です。なので、B.exeの画面が後ろに行ってしまうのでしょう。 HWND_TOPではうまくいきませんか? うまくいかない場合、AllowSetForegroundWindowで許可を与えた上で、SetForegroundWindowを使ってみてください。 SetForegroundWindow http://msdn.microsoft.com/ja-jp/library/cc411039.aspx
お礼
ご返事ありがとうございます。 >HWND_TOPではうまくいきませんか? うまくいかないのです。。。 >うまくいかない場合、AllowSetForegroundWindowで許可を与えた上で、SetForegroundWindowを使ってみてください。 ありがとうございます。試して見ます
最前面に表示すると言うAPIがあるのでソレを使ってみたらどうでしょうか? (ごめんなさい関数名は思い出せません) 後、処理対象はウィンドウハンドルで指定するので、 他アプリは対象アプリのウィンドウハンドルを取得する必要があります。
お礼
ご返事ありがとうございます。 >最前面に表示すると言う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をモニターの最前面に表示できるか教えていただきたく思います。 以上よろしくお願いします。
- ベストアンサー
- C・C++・C#
- 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を使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。
- ベストアンサー
- Visual Basic
- 実行中のプログラムが自分を隠すため
そうしたい場所で SetWindowPos(hW,HWND_NOTOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます どうしたら他の1つのプログラムのウィンドウに隠れた状態にする事ができるでしょうか?
- ベストアンサー
- C・C++・C#
- 非アクティブのウィンドウを最前面に呼び出したい。
右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、 システムフックをかけて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関数が呼ばれているのでフック自体は成功しているようなのですが、何かおかしな点はありますでしょうか?
- ベストアンサー
- C・C++・C#
- アクセス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させています。 しかし、実行されると最前面には来るのですがタイトルバーが点滅(?)した状態になりアクティブになりません。このフォームをクリックするとアクティブとなります。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- その他MS Office製品
- フォームのサイズを変更したいです。
フォームビューにて、 void CProject2View::OnBnClickedButton1() { this->SetWindowPos(&wndTop,0,0,100,100,SWP_NOMOVE); } とすると、スクロールバーが表示されるだけです。 タイトルのことをするにはどうすればいいですか? よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ダイアログ最前面表示時の後ろの画面操作について
はじめまして。 お世話になります。 開発環境:WindowsXP VC++6.0 MFC使用 ダイアログベースで画面を作成(A.exe CDialogベース)し、その画面でボタンを押下し 子画面(A_Child)を表示させます。表示方法はDoModal()で。 そのA_ChildはCDialogベースです。 A_Childダイアログが表示されている間(最前面)は、デスクトップ上の操作を 何も出来ない様にしたいのですが、方法はありますでしょうか? (例:スタート→ログオフでダイアログが表示しますよね。 その時ってそのダイアログ以外は触れないですよね。) せめて、自分たちが作成したアプリだけでも操作不可能にしたいのです。 SetWindowPos()、ModifyStyle()、色々試しましたが上手くいきません。 DoModalで表示させるのがそもそもまちがいののでしょうか? 何か方法が有りましたらよろしくお願いします。 説明が下手ですみません。
- ベストアンサー
- C・C++・C#
- 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__' 引数の与え方もいろいろなサイトの切れ端を集めたような感じで書いてしまったのでそもそもの書き方が違っているのかもしれません。 私の検索が不足なのは重々承知ですが、よろしければ実際にはどのように書けばウィンドウを最前面に出すことができるのかと、エラーメッセージの具体的な意味を教えて欲しいです。お願いします。
- ベストアンサー
- その他(プログラミング・開発)
お礼
ご返事ありがとうございます。 >SetForgroundWindow/AttachThreadInputなどを使う方法もありますよ 調べてがんばってみます!!! ありがとうございます。