dポイントプレゼントキャンペーン実施中!

自分の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);
をはずしても同じでした

A 回答 (4件)

他のウィンドウにフォーカスを移すには本来SetForegroundWindowだけで十分のはずで、


それで移動しない、戻ってくるのは余計な処理をしているからとしか考えられません。
そもそもShellExecuteで起動すればそれが最前面にくるはずです。
    • good
    • 0
この回答へのお礼

ありがとうございます

余計な事をしているみたいなので調べてみます

お礼日時:2004/11/02 22:23

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にいくのですが
すぐに自アプリに戻ってきます

補足日時:2004/11/02 21:35
    • good
    • 0

>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);
だけで希望の処理はできているけれどもその後
自アプリがフォーカスを奪うのが問題のようです
自アプリが寝たままだと困りますがおきたときにフォーカスを取らなければ問題はないようです

補足日時:2004/11/02 02:57
    • good
    • 0

>あとは、ボタンを押してってことなんで、ボタンのクリック時には処理をせずに、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がうつってくれます

補足日時:2004/11/02 01:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!