HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0325
あかさウィンドウの再アクティブ化8解決


あかさ

リンク

2016/3/25(Fri) 18:43:03|NO.75067

ウィンドウを再びアクティブにしたいです。

input a input b gsel 0,2 wait 500 gsel 0,2 objsel 1
五秒間の間にほかのウィンドウをクリックすると、そのあとにウィンドウが再アクティブ
になり、2つ目の入力ボックスが選択される、そしてそのままキーを打ち込めば入力ボックス
に入力される、というつもりで作ったのですが、入力ボックスは選択されるものの、そのまま
キーを打ち込んでも入力されません。
また、クリックしてアクティブにすると、タイトルバーの色が濃くなるのですが、これだと
濃くならないので、ウィンドウをクリックしないと本当にアクティブにならないのかなあ、
と思ったりもしました。
色々試したのですが、自分では無理なようです。
だれか、教えてください!



この記事に返信する


あかさ

リンク

2016/3/25(Fri) 19:26:43|NO.75069

できません!
何が間違っているのでしょうか?

#include "hspext.as" title "ABC" input a input b gsel 0,2 wait 500 aplsel "ABC" aplact objsel 1



zero

リンク

2016/3/25(Fri) 22:13:50|NO.75071

確か、別スレッドのウィンドウがアクティブになっている時に
自分のウィンドウをgselで再びアクティブにすることはできなかったはずです。
それを回避するためのgsel命令の強化版みたいなのを以前作っていたので、貼っておきます。
これを使えば再アクティブ化できると思います。


#module #uselib "USER32.DLL" #func GetWindowThreadProcessId "GetWindowThreadProcessId" sptr,sptr #func GetForegroundWindow "GetForegroundWindow" #func BringWindowToTop "BringWindowToTop" sptr #func AttachThreadInput "AttachThreadInput" sptr,sptr,sptr #func ShowWindow "ShowWindow" sptr,sptr #func SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr // 強制力の強いgsel #deffunc gsel2 int id, int sw gsel id, 0 if (sw < 0) { gsel id, -1 } else : if (sw != 0) { GetWindowThreadProcessId hwnd, 0 targetThreadId = stat GetForegroundWindow GetWindowThreadProcessId stat, 0 currentThreadId = stat if (targetThreadId == currentThreadId) { BringWindowToTop hwnd } else { AttachThreadInput targetThreadId, currentThreadId, 1 BringWindowToTop hwnd AttachThreadInput targetThreadId, currentThreadId, 0 } ShowWindow hwnd, 5 if (sw == 2) { SetWindowPos hwnd, -1, 0, 0, 0, 0, 3 } } return #global // 実行してみる input a input b gsel 0,2 wait 500 gsel2 0,2 objsel 1



cats

リンク

2016/3/25(Fri) 22:20:40|NO.75072

私の環境では下記リンク先と同じ手法でできました。
http://invers2008.blogspot.com/2008/10/mfc-how-to-steal-focus-on-2kxp.html



cats

リンク

2016/3/25(Fri) 22:21:17|NO.75073

かぶってしまいました。
zeroさんのと全く同じですのでNO.75072はスルーしてもらってOKです。



あかさ

リンク

2016/3/26(Sat) 10:37:51|NO.75077

おーすごい
ありがとうございます。
ただ、AttachThreadInput関数が何をしているのかが、msdnを見てもよく理解できません。
できましたら、だれか説明していただけないでしょうか。



cats

リンク

2016/3/26(Sat) 12:31:55|NO.75078

Windows XP(?)からは特定のプロセスをフォアグラウンドにするにはいくつかの条件が必要になり、
それを満たさないとタスクバーでアイコンが点滅するだけになりました。
MSDNによると、
>各ウィンドウが独自の入力状態を持ち、他のスレッドの入力処理と同期することはありません。
とあります。
つまり、AttachThreadInput関数でフォアグランドにあるウィンドウの入力を一度奪い、
それからフォアグランドにするように命令することで、ウィンドウを最前面に持ってこれます。

注意すべき点として、私はあまり詳しくないですが、AttachThreadInput関数の次の
SetForegroundWindowは、どうもハング状態とやらを引き起すようです。
そうなるとOS自体がウィンドウを検出できなくなるそうです。
https://blogs.msdn.microsoft.com/oldnewthing/20080801-00/?p=21393/

そういうときは他にもやり方はあるようなので、使ってみるといいです。
http://dobon.net/vb/dotnet/process/appactivate.html#section6



b

リンク

2016/3/26(Sat) 19:25:04|NO.75087

catsさん、丁寧な説明ありがとうございます。
よく理解できました。
OSの仕様なのですね。残念です。
zeroさん、catsさん、ありがとうございました。



あかさ

リンク

2016/3/26(Sat) 19:26:25|NO.75088

うわあ、すみません。
名前を間違えて変えてしまいました。
ほかの方と名前かぶってるし。
すみません。



ONION software Copyright 1997-2021(c) All rights reserved.