LogicoolゲームソフトウェアのランチャーでEverythingという検索ツールを起動しようとした。他のウィンドウの裏にいるときはトップウィンドウになることを期待したのだが、うまく最前面に来てくれない。
Everything.exeのパスを単純に設定しても無理そうなので、uwscを噛ましてウィンドウのアクティブ化を試みた。
uwscとWscript.Shellで試したところ、Exec関数はどちらもうまくいかず、shellのrunを使うとうまく起動できた。
//ExecEverything.uws Dim str_path_Everyshing="C:\Everything\Everything.exe" Dim wss= CreateOleObj("Wscript.Shell"); wss.Run(str_path_Everyshing, 1, false); wss=null; Dim wid=GETID("Everything","EVERYTHING") CTRLWIN(wid,ACTIVATE);
しかしながら、これだけだとうまく画面が最前面に来ないことがあった。
仕方がないので、user32.dllで出来ないか探ってみたところ、SetActiveWindowに次のような記述を見つけた。
指定されたウィンドウをアクティブウィンドウにする。hWndが示すウィンドウは、この関数を呼び出したスレッドに属するウィンドウでなければならない。他のスレッドが持つウィンドウに対するSetActiveWindowの呼び出しは、効果がない。
http://nienie.com/~masapico/api_SetActiveWindow.html
Claunchというランチャーからは問題なく動くが、ゲームソフトウェアから起動するとうまくいかない。もしかしたら、違うスレッドになってコントロールできないのかと思い、さっきのスクリプト自体をrunさせるスクリプトを組んでみた。
//Everything_wrap.UWS Dim wss= CreateOleObj("Wscript.Shell"); wss.Run("C:\UWSC\UWSC.exe Everything.UWS", 1, false); wss=null;
結果としては、ゲームソフトウェアでEverything_wrap.UWSを実行するようにすると、きちんと動くようになった。
動作は、若干もっさり。。。
コメント