• ベストアンサー

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

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

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

  • ベストアンサー
  • 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
質問者

お礼

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