• 締切済み

以前アクティブだったウィンドウを取得する方法

現在アクティブなウィンドウは GetForegroundWindow()で取得できるんですが その直前にアクティブだったウィンドウって 取得する方法はありますか?

みんなの回答

  • passepied
  • ベストアンサー率50% (18/36)
回答No.4

あるエディットボックスにフォーカスをあてておいて後からプログラムを起動した場合にはそのエディットボックスがなんだったかを取得する方法は私には思いつきません。 私だったらお望みの動作を行うためには次のアプローチで行います。 1.その動作を行うプログラムはあらかじめ起動しておくことにする。 2.その動作を行う際にはホットキー(ATL, CTRL, SHIFTなどと通常のキーを組み合わせたあまり使われることのないキー)により行うことにする。 この条件で動作するプログラムは 1.グローバルフックをセットしてホットキーが押されたことを検知して 2.そのときにフォーカスのあたっているWindowのハンドルを取得する。 3.そのハンドルの指すWindowがエディットボックスだったら目的の動作を行う。 でいかがでしょう?

sprintfalls
質問者

お礼

ありがとうございます。 まだその方法を試していないんですが、なかったらそうしようと思います。 実は、Docomoのi絵文字というツールがあるのですが、それはフォーカスが当たっていた任意のエディットボックスに(含IE)特定の絵文字のボタンを押すと、その文字コードを入れる、ていうものです。 それと同じように文字を入れられると思ったのですが、難しいようですね。。

回答No.3

GetNextWindow()を使ってz軸(前後関係)でひとつ後ろのウインドウハンドルを取得できます。 ---------------------------------------- hWnd=自分自身など現在アクティブなウインドウのハンドル hWnd=GetNextWindow(hWnd,GW_HWNDNEXT); ---------------------------------------- このようにすればひとつ後ろのウインドウハンドルが取得できますが、多くの場合IMEがひとつ後ろになりますので思ったとおりの結果が得られない可能性があります。ウインドウハンドルを取得後、GetWindowText()でウインドウタイトルを取得し、IMEのようだったら再度GetNextWindow()を行う必要があります。 もしくはGetNextWindow()だけでは不十分なのかも知れません。 pease(char *str,HWND cWnd){ char buf[256]; int num=0; do{ if(num++ > 200) break; cWnd=GetNextWindow(cWnd,GW_HWNDNEXT); GetWindowText(cWnd,buf,sizeof(buf)); }while(strstr(buf,"Internet Explorer")==NULL); if(SetForegroundWindow(cWnd)==FALSE){ MessageBox(NULL,TEXT("errrr1"),TEXT("blog"),MB_OK); } keybd_event(VK_CONTROL, 0, 0, 0); keybd_event('V', 0, 0, 0); keybd_event('V', 0, KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0); }

sprintfalls
質問者

お礼

上記の様にしたんですが、 200通り全て""になってしまいました。 どこが駄目なのかもわからずで、どうすればいいか…。

  • passepied
  • ベストアンサー率50% (18/36)
回答No.2

あるエディットボックスにフォーカスがある状態でプログラムを起動してそのエディットボックスに文字列を入力したいが、プログラムを起動した時点でそのプログラムのWindowにフォーカスが移ってしまうのでその前にフォーカスのあったWindowを知りたい。 ということでしょうか?

sprintfalls
質問者

お礼

言いたいことはそうです。 わかりやすくしてくれてありがとうございます。 |(_ _)|

  • passepied
  • ベストアンサー率50% (18/36)
回答No.1

フックを利用してWM_ACTIVATEを監視して、アクティブWindowの履歴を記録すればできるような気がします。 が、なぜそのようなことがしたいのかわかればもっと適切な方法を示すことができるかもしれません。

sprintfalls
質問者

お礼

ありがとうございます。 何に使うかというと、現在フォーカスが当たっているエディットに文字列を入れたいからです。 そのために、ハンドルを取得して操作できるかなと考えました。 なにか詳細を教えてくれれば嬉しいです。

関連するQ&A