PB 電子会議室
発言No. | 更新日 | 題名(クリックすると発言内容と関連するコメントが表示されます) |
---|---|---|
23801 | 11/08/02 18:51:28 | RE(2):PB11.5:外部アプリケーションの監視(起動からタスクバーにボタンが作成されるまで) By itigo |
23800 | 11/07/23 08:52:39 | RE(1):PB11.5:外部アプリケーションの監視(起動からタスクバーにボタンが作成されるまで) By ace |
23799 | 11/07/21 16:46:12 | PB11.5:外部アプリケーションの監視(起動からタスクバーにボタンが作成されるまで) By itigo |
カテゴリ:スクリプトの記述
日付:2011年07月23日 08:52 発信者:ace
題名:RE(1):PB11.5:外部アプリケーションの監視(起動からタスクバーにボタンが作成されるまで)
itigoさん、こんばんは。
CreateProcessを使用しているのでProcessIDは利用できると思いますそこで
外部関数として
FUNCTION UnsignedLong GetWindow (UnsignedLong hWnd,UnsignedLong uCmd) LIBRARY \"USER32.DLL\"
FUNCTION UnsignedLong GetTopWindow (UnsignedLong hWnd) LIBRARY \"USER32.DLL\"
FUNCTION Long GetWindowThreadProcessId(UnsignedLong hWnd,ref Long lpdwProcessId)
LIBRARY \"USER32.DLL\"
宣言
先ほどのスクリプトを利用して記述してみると
(7/23ラグありそうなのでコメント修正)
unsignedlong GW_HWNDNEXT = 2
unsignedlong hWND
Long lpdwProcessId
OPEN(w_kidoutyu) // 【起動中…】テキストを張り付けたウィンドウのOPEN
CreateProcess(Null, アプリBのパス, Null, Null, False, 0, アプリBの格納パス,
STARTINFO,PROCESS_INFORMATION)
if WaitForInputIdle(PROCESS_INFORMATION.hProcess,120000) = 0 then
SetNull(hWnd)
hWnd = GetTopWindow(hWnd)
Retry:
DO WHILE hWnd <> 0
YIELD() //もしOSに制御を渡したければこれも記載
GetWindowThreadProcessId(hWnd,lpdwProcessId)
IF lpdwProcessId = PROCESS_INFORMATION.dwProcessId THEN
EXIT
END IF
hWnd = GetWindow(hWnd,GW_HWNDNEXT)
IF hWnd = 0 THEN GOTO Retry //リトライは何回にするか、決めた方がいいと思います
LOOP
end if
ここで hWnd にハンドルが取得できているので状態監視ができると思います。
もっとも、ハンドルが取れているので、このまま
Close(w_kidoutyu)
でもいい気がします。
付加情報:
PowerBuilder Version (記載なし)
Client SoftWare
OS Windows XP
DBMS Sybase SQL Anywhere Client
Browser InternetExplorer
Server SoftWare
OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)
Copyright © 2013 Power Future Co., Ltd.