teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

誤字修正

2019/05/02 03:34

投稿

tacsheaven
tacsheaven

スコア13707

answer CHANGED
@@ -1,7 +1,7 @@
1
1
  [SetForegroundWindow](https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setforegroundwindow) 関数は Windows 98 の頃の実装から、**入力を受け付けるプロセスでないと最前面に出せない**ようになっています。
2
2
  ※これはいままで入力を受け付けていたプロセスを飛び越して別のプロセスが前に出てきて入力を奪うのはいかがなものか、という観点から変更されたものと言われています
3
3
 
4
- このために SetForegroundWindow を呼び出す直前に、[AttachThreadInput](https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-attachthreadinput) を呼び出して入力イベントを受け取れる状態にして SetForegroundWindow 呼び出し、その後 DetachThreadInput 切り離し、というのが常道でした。
4
+ このために SetForegroundWindow を呼び出す直前に、[AttachThreadInput](https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-attachthreadinput) を呼び出して入力イベントを受け取れる状態にして SetForegroundWindow 呼び出し、その後 もう一度AttachThreadInput を呼び出して切り離し、というのが常道でした。
5
5
  が、これは結構危険です(瞬間的にでも入力を受け付けることになるため)。
6
6
 
7
7
  Windows Vista 以降では [BringWindowToTop](https://docs.microsoft.com/ja-jp/windows/desktop/api/winuser/nf-winuser-bringwindowtotop) 関数や [SetWindowPos](https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos) 関数を使う、のが推奨となっています。