• ベストアンサー

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

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

  • keyguy
  • お礼率68% (895/1314)

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.5

>ShowWindow(hW,SW_SHOWMAXIMIZED); >SetWindowPos(hW,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); >SetForegroundWindow(hW); >SetActiveWindow(hW); >SetFocus(hW); >SetActiveWindow(hW); これは余分 同一プロセス内でないと意味なし。 >SetFocus(hW); これもキーボードフォーカスなんで意味なし。 ということで、 GetForegroundWindow()とAttachThreadInput() 入れてみたらどうなります?

keyguy
質問者

お礼

訂正します サブは BOOL CALLBACK EnumProc(HWND hW,LPARAM) { char s[999]; SendMessage(hW,WM_GETTEXT,999,(LPARAM)s); if(string(s).find("MyWindow")!=string::npos) { ShowWindow(hW,SW_SHOWMAXIMIZED); DWORD dw_html=GetWindowThreadProcessId(hW,NULL); DWORD dw_main=GetWindowThreadProcessId(hWmain,NULL); AttachThreadInput(dw_main,dw_html,TRUE); SetForegroundWindow(hW); AttachThreadInput(dw_html,dw_main,FALSE); return FALSE; } return TRUE; } メインの処理場所は ofs.open("MyWindow.html"); ofs<<"<title>MyWindow</title>"<<endl; ofs.close(); ShellExecute(NULL,"open","MyWindow.html",NULL,NULL,SW_SHOWMAXIMIZED); EnumWindows(&EnumProc,NULL); です

keyguy
質問者

補足

度々ありがとうございます サブを BOOL CALLBACK EnumProc(HWND hW,LPARAM) { char s[999]; SendMessage(hW,WM_GETTEXT,999,(LPARAM)s); if(string(s).find(str_html)!=string::npos) { DWORD dwPid; DWORD dwTidNow=GetWindowThreadProcessId(hW,&dwPid); DWORD dwTidMe=GetCurrentThreadId(); AttachThreadInput(dwTidMe,dwTidNow,TRUE); ShowWindow(hW,SW_SHOWMAXIMIZED); SetForegroundWindow(hW); AttachThreadInput(dwTidNow,dwTidMe,FALSE); return FALSE; } return TRUE; } とし メインのボタンの処理を case IDOUT: ofs.open("MyWindow.html"); ofs<<"<html><title>MyWindow</title></html>"<<endl; ofs.close(); ShellExecute(NULL,"open","MyWindow.html",NULL,NULL,SW_SHOWMAXIMIZED); EnumWindows(&EnumProc,NULL); break; としましたが結局自分にフォーカスが戻ると共に自分が前面表示されます 自分が最小化しないとフォーカスを他のWindowに渡すのは不可能みたいですね? 先のZオーダを変えた異常Windowが前面表示されたのは異常がゆえにフォーカスが自分に戻っても異常Windowが後ろに回れないからで 問題はフォーカスをいかに自分以外のWindowにうつすかという問題1つだとおもいます マイクロソフトの仕様上不可能かもしれませんね?

その他の回答 (4)

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.4

自分を隠す必要はあるのですか? ボタンクリック時に 1、表示したい他のウィンドウを見つける 2、そのウィンドウを表示する(SetWindowPos(hW, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);) でいいのでは。 メモ帳終了時に自身を確実に表示したいなら WaitForSingleObjectでメモ帳の終了を感知する方法があります。

keyguy
質問者

お礼

ありがとうございます メモ帳ではなくhtml(ie6.0で開く)でした このhtmlにzオーダを指定してトップにしてしまうとhtmlウィンドウを裏に表示することが難しくなり最小化ボタンを押さないと他のウィンドウを表示できなくなります そのため異常化したウィンドウになってしまい殺さないと以後の作業がしにくくなります またトップに表示されてもフォーカスは元の裏に隠れているプログラムウィンドウに戻ってしまうようでクリックしてフォーカスを新ウィンドウに切り替えなければなりません したがってやろうとしている事は自分をアイコン化や最小化しないと不可能ではないかと思います 表に表示させたWindowを殺したらすぐに元のプログラムウィンドウがフォーカスを持って現れる快適な状況は望めないかもしれませんね

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

>としたのですが(hWはこのプログラムのメインウィンドウ)一旦はかくれるもののすぐに自分が前面に現れます ボタンをクリックしてるからだと。 >ウィンドウを見つけて最大化させてみたのですが前面表示されません アクティブにはなってます? 最前面にしたいウィンドウに一旦SetWindowPosでHWND_TOPMOSTをいったんつけて、HWND_NOTOPMOSTにしてあげると前に行くかな? あとは、ボタンを押してってことなんで、ボタンのクリック時には処理をせずに、PostMessageで自分宛に独自メッセージをポストし、ポストしたメッセージを受け取ってから他アプリの最前面化をしてみるのも効果があるかも。

keyguy
質問者

お礼

ありがとうございます BOOL CALLBACK EnumProc(HWND hW,LPARAM) { char s[999]; SendMessage(hW,WM_GETTEXT,999,(LPARAM)s); if(string(s).find("MyWindow")!=string::npos) { ShowWindow(hW,SW_SHOWMAXIMIZED); SetWindowPos(hW,HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); SetForegroundWindow(hW); SetActiveWindow(hW); SetFocus(hW); return FALSE; } return TRUE; } とWindow検索サブの方を変更したら前面表示されるようになりますが フォーカス(アクティブ?)がもらえないだけでなく タスクバーのほかのWindowをクリックしても MyWindowが前面表示されたままになってしまいます こちらがうまく行けばあちらが状態です SetWindowPosでZオーダをいじるのは危険ですね

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>最大化され前面に一旦はでるもののすぐに自分(動作をさせるプログラム)のWindowの裏に隠れてしまいます AttachThreadInput()使ってね。 http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/00018016.htm

参考URL:
http://mfc.acty-net.ne.jp/ml/mfc/logTop/logAll/00018016.htm
keyguy
質問者

お礼

ありがとうございます したいことは以下の通りです 自分のWindow内のあるボタンをクリックしたら 既存か新規作成のメモ帳に情報を書きこんでそのメモ帳を最大化し前面に表示し メモ帳を×をクリックして殺したら 自分のウィンドウがフォーカスを持って現れるようにしたいのです だからHideだとメモ帳を殺した後も消えたままなのでまずいのです

keyguy
質問者

補足

訂正します メモ帳ではなくhtmlファイルです ieが閉じているときには ウィンドウを見つけて最大化するような処理すらしなくても最大化前面表示してくれるのですが 既にieが開いているときには最大化も前面表示もされないので ウィンドウを見つけて最大化させてみたのですが前面表示されません

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

ShowWindowのSW_HIDEで消しちゃだめなの?

keyguy
質問者

お礼

ありがとうございます 一番上のウィンドウの裏におき一番上のウィンドウが消されたらフォーカスを持った状態で現れるようにしたいのです

関連するQ&A

  • 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を使用しているかもしれません。 情報が少なくて恐縮ですが、この内容で解決の手掛かりとなる事をご教授頂けると幸いです。

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

    お世話になります。 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が他のアプリケーションを含めて、最前面、モニターの最前面に表示されるようにしたいのです。 お手数ですがなにとぞよろしくお願いします。 以上よろしくお願いします。

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

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

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

    右ダブルクリックで呼び出すランチャプログラムを作成したいのですが、 システムフックをかけて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関数が呼ばれているのでフック自体は成功しているようなのですが、何かおかしな点はありますでしょうか?

  • 最大化時のフルスクリーン

    いつもお世話になっております。 VS2005 を使ってWindowsアプリケーションの実装を行っています。 最大化時にフルスクリーンにしたくプログラムを作成しているのですが、 WndProc内で下記のプログラムを実行し、 最大化アイコンをクリックするとバグ?が起きてしまいます。 -------------------------------------------------- case WM_SIZE:   cxClient = LOWORD(lParam);   cyClient = HIWORD(lParam);   if(wParam == SIZE_MAXIMIZED){ //最大化されたら     ShowWindow(hWnd, SW_SHOWNORMAL); //(1)ウィンドウを元のサイズに戻す     //(2)アプリケーションのウィンドウのフレームを「なし」にする     GetWindowLong(hWnd, GWL_STYLE); //ウインドウ・スタイルの取得     SetWindowLong(hWnd, GWL_STYLE, WS_POPUP); //ウインドウ・スタイルの設定     SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER);     ShowWindow(hWnd, SW_MAXIMIZE); //(3)ウィンドウ最大化   } return 0; -------------------------------------------------- 実行したアプリケーションの右上の最大化ボタンを押すと、 見た感じではif文の中を繰り返し行っているような・・・ 元のサイズに戻って最大化になってを数秒繰り返して 最後にペイントして停止します。(高速なため確かではありません) 上記プログラムをどう直したらよいのでしょう。 ご教授お願いいたします。

  • 「コンパイルエラー End Subが必要です。」

    Access2016でファイルを作成しているのですが、下記のVBAを実行しようとすると、「コンパイルエラー End Subが必要です。」とエラーメッセージが返ってきてしまいます。 構文の修正が必要であるとお気づきであれば、その箇所を教えていただけないでしょうか。初歩的な質問で恥ずかしい限りですが、何卒よろしくお願い致します。 Option Compare Database Option Explicit Public Declare PtrSafe Function SetWindowPos Lib "user32" _ (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _ ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, _ ByVal fuFlags As Long) As Long Public Declare PtrSafe Function GetSystemMenu Lib "user32" _ (ByVal hWnd As Long, ByVal fRever As Long) As Long Public Declare PtrSafe Function RemoveMenu Lib "user32" _ (ByVal hMenu As Long, ByVal uItem As Long, ByVal fuFlags As Long) As Long Public Const SWP_NOMOVE = &H2 Public Const SWP_NOSIZE = &H1 Public Const HWND_TOP = &H0 Public Const SC_SIZE = &HF000 Public Const SC_MAXIMIZE = &HF030 Public Const SC_CLOSE = &HF060 Public Const SC_RESTORE = &HF120 Public Const MF_BYCOMMAND = &H0& Public Sub test() Private Sub Form_Open(Cancel As Integer) Dim hWnd As Long hWnd = Application.hWndAccessApp SetWindowPos hWnd, HWND_TOP, 0, 0, 800, 600, SWP_NOMOVE hWnd = GetSystemMenu(hWnd, 0) RemoveMenu hWnd, SC_SIZE, MF_BYCOMMAND End Sub

  • windowを常に手前にしたい。

    すみません。教えてください。 [環境] windows2000 visual c++6.0 [内容] 親ウインドウから子ウインドウを呼び出して、常に子ウインドウを手前にし、かつ常にアクティブにしたいのですが、うまくいきません。 [ソース] 親ウインドウ : : : CSysCp02Dlg2* frm02Dlg; frm02Dlg = new CSysCp02Dlg2(); frm02Dlg->Create(IDD_SYSCP02_DIALOG,NULL); frm02Dlg->ShowWindow(SW_SHOW); : : (裏で処理をする) :  delete frm02Dlg; (処理の終了) [ソース]子ウインドウ : : :  this->SetActiveWindow();  this->SetWindowPos(&wndTop,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE); : : : イメージ的には、DoModalで子ウインドウを表示し、裏の親ウインドウで処理をしたいのです。(もちろんDoModalでは無理なので、Createをしていますが....) どなたかご存知の方いらっしゃいましたら、ご教授お願いいたします。

  • 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

  • Formをアクティブにする

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

  • 次のWindowsアプリで

    メッセージボックスは他のアプリのWindowの下に隠れることはないのですが他のアプリのウィンドウをクリックするとメッセージボックスの焦点がぼけアクティブでなくなります メッセージボックスを常にアクティブにする方法を終えてください #include <windows.h> using namespace std; WINAPI WinMain(HINSTANCE hI,HINSTANCE,LPSTR,int) { HWND hW; hW=CreateWindow("STATIC","",WS_OVERLAPPED, 0,0,9,9,NULL,NULL,hI,NULL); SetWindowPos(hW,HWND_TOPMOST,0,0,9,9,NULL); MessageBox(hW,"OK?","",MB_OK); return 0; }

専門家に質問してみよう