他のアプリケーションの操作

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 他のアプリケーションの操作

by mir » 2005年10月19日(水) 22:12

Toshiさん、hiraさん すばやい返答ありがとうございます。

お二人方のお答えより、次のような形のプログラムを考えました。

コード: 全て選択


Dim hNew As DWord

Dim strExeFileName As String
Dim udtProcessAttributes As SECURITY_ATTRIBUTES
Dim udtThreadAttributes As SECURITY_ATTRIBUTES
Dim udtStartupInfo As STARTUPINFO
Dim udtProcessInformation As PROCESS_INFORMATION
Dim dwWaitForObjectEvent As DWord

'実行可能ファイル名を指定[起動にある程度時間がかかるソフトで試してみて下さい]
strExeFileName="C:\Program Files\Microsoft Office\Office10\Winword.exe"
'セキュリティ構造体を初期化
udtProcessAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
udtThreadAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
'新しいプロセスのメインウィンドウの表示状態を指定
udtStartupInfo.cb=SizeOf(STARTUPINFO)
'新しいプロセスを作成
CreateProcess(strExeFileName,NULL,udtProcessAttributes,udtThreadAttributes,FALSE,0,NULL,NULL,udtStartupInfo,udtProcessInformation)
'新しいプロセスが初期化を完了するまで待機
dwWaitForObjectEvent=WaitForInputIdle(udtProcessInformation.hProcess,INFINITE)
'待機結果を表示
Select Case dwWaitForObjectEvent
    Case 0
        MsgBox NULL,"プロセスを初期化しました。"
    Case WAIT_TIMEOUT
        MsgBox NULL,"待機はタイムアウトしました。"
    Case -1
        MsgBox NULL,"待機は失敗しました。"
End Select
With udtProcessInformation
    CloseHandle(.hProcess)
    CloseHandle(.hThread)
End With

hNew = GetForegroundWindow()
MessageBox(hNew, NULL, NULL, MB_OKCANCEL)
これを実行したとき、プロセスの初期化中に他のアプリケーションの操作をしないと、ちゃんとメッセージボックスが初期化したプロセスを親として持つのですが、プロセスの初期化中に他のアプリケーションを操作してしまうと、プロセスの初期化が完了しても、メッセージボックスは操作していたアプリケーションを親として持ってしまいます。
100%安全に初期化したプロセスのウィンドウハンドルを取得することはできないでしょうか?

by hira » 2005年10月19日(水) 21:10

手元にあるVB6の本をABで動くように書き直しただけですが…
起動したアプリの初期化(起動)が完了すれば制御が返ります。タイムアウトは10秒になっていますが、用途によってはINFINITEにしてもいいかもしれません[WaitForInputIdleの第2引数]。

コード: 全て選択

Dim strExeFileName As String
Dim udtProcessAttributes As SECURITY_ATTRIBUTES
Dim udtThreadAttributes As SECURITY_ATTRIBUTES
Dim udtStartupInfo As STARTUPINFO
Dim udtProcessInformation As PROCESS_INFORMATION
Dim dwWaitForObjectEvent As DWord

'実行可能ファイル名を指定[起動にある程度時間がかかるソフトで試してみて下さい]
strExeFileName="C:\Program Files\Microsoft Office\Office10\Winword.exe"
'セキュリティ構造体を初期化
udtProcessAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
udtThreadAttributes.nLength=SizeOf(SECURITY_ATTRIBUTES)
'新しいプロセスのメインウィンドウの表示状態を指定
udtStartupInfo.cb=SizeOf(STARTUPINFO)
'新しいプロセスを作成
CreateProcess(strExeFileName,NULL,udtProcessAttributes,udtThreadAttributes,FALSE,0,NULL,NULL,udtStartupInfo,udtProcessInformation)
'新しいプロセスが初期化を完了するまで待機
dwWaitForObjectEvent=WaitForInputIdle(udtProcessInformation.hProcess,10000)
'待機結果を表示
Select Case dwWaitForObjectEvent
	Case 0
		MsgBox NULL,"プロセスを初期化しました。"
	Case WAIT_TIMEOUT
		MsgBox NULL,"待機はタイムアウトしました。"
	Case -1
		MsgBox NULL,"待機は失敗しました。"
End Select
With udtProcessInformation
	CloseHandle(.hProcess)
	CloseHandle(.hThread)
End With

by Toshi » 2005年10月19日(水) 20:27

GetForegroundWindow API でアクティブなウィンドウのハンドルを取得して、
SendMessage API でメッセージを送ってみるのはどうでしょうか?
但し、ウィンドウが表示されるタイミングを見計らって取得しなければなりませんが...

他のアプリケーションの操作

by mir » 2005年10月19日(水) 19:57

はじめまして、最近ActiveBasicをはじめた者です。

早速質問なのですが・・・。
他のアプリケーションを起動して、そのアプリケーションにウィンドウメッセージを送ったり、横取り(?)したりすることは可能でしょうか?
一応、ShellExecute関数で他のアプリケーションを起動できることはわかったのですが、その起動したアプリケーションのウィンドウハンドルの取得方法がわかりません。

どなたか、回答をいただけないでしょうか。
よろしくお願いします。

ページトップ