- ベストアンサー
アプリがフォーカスを
自分のWindowから他のアプリのWindowに 移す事は可能でしょうか? 仕様上不可能なのでしょうか? 可能だとすれば 自アプリのWindowをhWmineとし 他アプリのWindowをhWotherとしたとき どのようにすればいいのでしょうか? ちなみに DWORD dw_other=GetWindowThreadProcessId(hWother,NULL); DWORD dw_mine=GetWindowThreadProcessId(hWmine,NULL); AttachThreadInput(dw_mine,dw_other,TRUE); ShowWindow(hWother,SW_SHOWMAXIMIZED); SetForegroundWindow(hWother); AttachThreadInput(dw_other,dw_mine,FALSE); とするとすぐに一瞬他Windowにフォーカスが移りすぐに自Windowにフォーカスが戻ってきます 最後の AttachThreadInput(dw_other,dw_mine,FALSE); をはずしても同じでした
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
他のウィンドウにフォーカスを移すには本来SetForegroundWindowだけで十分のはずで、 それで移動しない、戻ってくるのは余計な処理をしているからとしか考えられません。 そもそもShellExecuteで起動すればそれが最前面にくるはずです。
その他の回答 (3)
- i_love_chocochan
- ベストアンサー率39% (11/28)
HWND SetForegroundWindowEx(HWND hWnd) { // 強制的に Foreground にする HWND hWndOrg = ::GetForegroundWindow(); DWORD dwID= ::GetWindowThreadProcessId(hWndOrg, NULL); AttachThreadInput(::GetCurrentThreadId(), dwID, TRUE); ::SetForegroundWindow(hWnd); AttachThreadInput(::GetCurrentThreadId(), dwID, FALSE); return hWndOrg; } の引数 hwnd を他のアプリのウィンドウズハンドルにすればいいと思います。
補足
ありがとうございます 前面に出したいhtmlのWindowはhWhtmlとし 前面に出ているのは自アプリのWindowでWmainとしたときに DWORD dw_html=GetWindowThreadProcessId(hWhtml,NULL); DWORD dw_main=GetWindowThreadProcessId(hWmain,NULL); AttachThreadInput(dw_main,dw_html,TRUE); SetForegroundWindow(hW); AttachThreadInput(dw_html,dw_main,FALSE); を実行しても一瞬フォーカスがhtmlにいくのですが すぐに自アプリに戻ってきます
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>ShellExecute(NULL,"open","mywindow.html",NULL,NULL,SW_SHOWMAXIMIZED); 起動直後だと早すぎるのかも。 WaitForInputIdleで起動したIEが入力待ちになるまで待ってみるとか。 >Sleep(1000); 1秒じゃ足りないのかも・・・ WaitForInputIdle()で試す前に1分くらい待ってみたらどうなります? あと、Sleepじゃなくてちゃんとタイマー作ってみるとか。
補足
ありがとうございます 60秒でやってみると60秒たつまで HTMLが前面に出てしかもフォーカスされています しかし60秒後自アプリが起きてきてフォーカスを奪い取ります だから ShellExecute(NULL,"open",str1.c_str(),NULL,NULL,SW_SHOWMAXIMIZED); だけで希望の処理はできているけれどもその後 自アプリがフォーカスを奪うのが問題のようです 自アプリが寝たままだと困りますがおきたときにフォーカスを取らなければ問題はないようです
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>あとは、ボタンを押してってことなんで、ボタンのクリック時には処理をせずに、PostMessageで自分宛に >独自メッセージをポストし、ポストしたメッセージを受け取ってから他アプリの最前面化をしてみるのも効果があるかも。 これどうなりますかねぇ? もしくはタイマーでボタンを押してから1秒後ぐらいに処理させてみるとか。 単にボタンを押して、その後ボタンを戻す処理をWindowsがするから自ウィンドウにフォーカスが戻ってくるような気がするんですけど。
補足
ありがとうございます サブを 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; } とし メインのボタン処理場所を ofs.open("mywindow.html"); ofs<<"<title>MyWindow</title>"<<endl; ofs.close(); ShellExecute(NULL,"open","mywindow.html",NULL,NULL,SW_SHOWMAXIMIZED); b_out=true; とだけし WinMainのお決まりの処理を while(GetMessage(&ms,NULL,NULL,NULL)) { TranslateMessage(&ms); DispatchMessage(&ms); if(b_out==true) { Sleep(1000); EnumWindows(&EnumProc,NULL); b_out=false; } } としましたがしっかりフォーカスが自分に戻ってきます 絶対にフォーカスを戻すんだという意気込みが感じられます 勿論自Windowを最小化するときれいにFocusがうつってくれます
お礼
ありがとうございます 余計な事をしているみたいなので調べてみます