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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0521
名無しすべてのウィンドウタイトル取得5解決


名無し

リンク

2010/5/21(Fri) 18:16:06|NO.32730

ソフトを起動した時点で、例えば「メモ帳」が起動していたら、アクティブでなくても終了させるようにしたいのですが。
アクティブのタイトルを取得スル方法は知っていますが、アクティブでないウィンドウタイトルを取得する事って出来ますか?



この記事に返信する


ANTARES

リンク

2010/5/21(Fri) 23:24:54|NO.32731

 aplselでできます。



窓口

リンク

2010/5/22(Sat) 05:51:19|NO.32736

ファイルのフルパスから検索する方法を考えてみました。


#module #include "kernel32.as" #uselib "psapi.dll" #func EnumProcessModules "EnumProcessModules" int, sptr, int, sptr #func GetModuleFileNameEx "GetModuleFileNameExA" int, int, sptr, int #define ERROR_NO_MORE_FILES $00000012 #define TH32CS_SNAPPROCESS $2 #define PROCESS_VM_READ $10 #define PROCESS_QUERY_INFORMATION $400 // 指定した実行ファイル名が実行されているかを調べて返す。 ; 1 検索する実行ファイル名 ; 大文字小文字の区別はしない ;[戻り値] ; 実行されている総数 #defcfunc SearchExecutioningFileName str srp_Exefilename_ // スナップショットの作成 CreateToolhelp32Snapshot TH32CS_SNAPPROCESS, 0 if stat ! -1 { hSnap = stat }else{ return -1 } // PROCESSENTRY32構造体の定義 dim pe32 , 9 + (260/4) pe32.0 = length(pe32) * 4 dim hMod dim hProcess dim nNeed dim ReturnStat sdim filename , 256 // 小文字に変換 SearchFileName = getpath( srp_Exefilename_ , 16) // 先頭のプロセスの情報を取得 Process32First hSnap , varptr( pe32 ) // 失敗した場合戻る if stat = 0 { CloseHandle hSnap return -1 } repeat // プロセスを開く OpenProcess PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, 0, pe32.2 if stat { hProcess = stat EnumProcessModules hProcess, varptr(hMod), 4, varptr(nNeed) if stat { GetModuleFileNameEx hProcess, hMod, varptr(FileName), 255 if getpath( FileName , 16 ) = SearchFileName { ReturnStat++ } } // プロセスを閉じる CloseHandle hProcess } // 次のプロセス情報を取得 Process32Next hSnap , varptr( pe32 ) GetLastError if stat = ERROR_NO_MORE_FILES : break loop CloseHandle hSnap return ReturnStat #global // プロセス内からメモ帳を検索する if SearchExecutioningFileName( "C:\\Windows\\System32\\NotePad.exe" ) { dialog strf("%dつのメモ帳が実行されています。",stat) }else{ dialog "メモ帳は実行されていません" }



thanbo

リンク

2010/5/22(Sat) 09:24:53|NO.32737

窓口さんどうしちゃったんですか!以前は質問してばっかりの人だったのに、
今ではAPIを使ったコードを人に教えるまでに成長したんですね!!!



テック

リンク

2010/5/22(Sat) 15:26:14|NO.32738

>ソフトを起動した時点で、例えば「メモ帳」が起動していたら、アクティブでなくても終了させるようにしたいのですが。
>アクティブのタイトルを取得スル方法は知っていますが、アクティブでないウィンドウタイトルを取得する事って出来ますか?
え〜と、質問の内容は、あるプログラムから別のプログラムを終了させるために
非アクティブのウィンドウタイトルを取得する方法を知りたいということで
よろしいでしょうか?

>aplselでできます。
ANTARESさんの記述を見て、aplsel命令で起動中であるか調べて、
sendmsg命令で、終了メッセージを送信すれば出来るんじゃないかと
思いましたが、aplsel命令では、起動中か否かが判別できるだけで、
検索条件にヒットしたウィンドウハンドルが分かるわけではないのですね^^;
またこの方法だと、実行するときにウィンドウタイトルが分かっていないと
いけませんし^^;

↓作ってしまった確認スクリプト

#include "hspext.as" // マクロ宣言 #define TEST_WINDOW_TITLE "無題 - メモ帳" #define WM_QUIT 0x12 // グローバル変数宣言 g_hWndAnthor = 0 // 別アプリケーションのウィンドウハンドル g_nSearchId = 0 // アプリケーションを検索する開始ID g_bActive = 0 // 起動しているか否かのフラグ g_strTitle = 0 // 正式なウィンドウタイトル // 指定のアプリケーションを検索する aplsel TEST_WINDOW_TITLE, g_nSearchId // 戻り値を退避しておく g_bActive = stat g_strTitle = refstr // アプリケーションが見つからなかった場合 if(g_bActive = 1) { mes TEST_WINDOW_TITLE + "は、起動していません" // アプリケーションが見つかった場合 } else { mes TEST_WINDOW_TITLE + "は、起動しています" mes "正式なウィンドウタイトルは、" + g_strTitle + "です。" // 見つかったウィンドウに終了メッセージを // 送信しようと思ったんだけど・・・ // sendmsg g_nSearchId, WM_QUIT, 0, 0 }

起動中のウィンドウを調べる方法をググってたらありました。
↓ウィンドウの列挙
http://wisdom.sakura.ne.jp/system/winapi/win32/win142.html

記事を読みましたら、EnumWindows関数を使用するみたいですが、
第1引数に自作のコールバック関数のポインタを渡さないと
いけないみたいです。
自作のコールバック関数をDLL用にエクスポートし、
HSP側の#funcで自作のコールバック関数を登録し、
varptrでEnumWindows関数に自作関数のポインタを渡せばいいのかもしれません^^;

>窓口さんへ
以前のスクリプトを含めて
(http://hsp.tv/play/pforum.php?mode=all&num=32595)
窓口さんのスクリプトが、プロセス関連のAPIを調べるきっかけになりました。
ありがとうございます。m(__)m
今後も教養のために参考にさせていただきます。



名無し

リンク

2010/5/22(Sat) 16:38:43|NO.32740

みなさんありがとうございます
無事できました!



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