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


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
1019
kojui他アプリ 起動 感知するには6解決


kojui

リンク

2021/10/19(Tue) 17:24:21|NO.94205

特定アプリをHSP プログラム上でなく起動する(例 デスクトップのアイコンでプログラム
またはショートカットを起動)ことを検知するにはどうすればいいですか?



この記事に返信する


zrs90(5さい)

リンク

2021/10/19(Tue) 18:17:02|NO.94207

特定のアプリのファイル名が分かっているなら
os標準の タスクマネージャー で見れば
良いのでは?(※特殊なソフトだと見えない事もある?)

後は、ソフトの起動検知 とかで検索すると
その関係のソフトが入手出来ます。



zrs90(5さい)

リンク

2021/10/19(Tue) 19:36:25|NO.94208

補足。

タスクマネージャーが起動したら
プロセスのタブを開いて下さい。
基本的に、現在起動している.exeのファイルが
全て表示されます。

後、ここはHSPの掲示板なので...記述しておきます。
hspextのサンプルに、aplkey3.hsp
があります。ただタスクマネージャーに比べると
性能は落ちますが...



こいる

リンク

2021/10/19(Tue) 23:59:11|NO.94210

全プロセスを列挙し、ファイル名からアプリを識別するのを繰り返して検知する方法です。
使いやすいよう、モジュールにしてみたので良ければどうぞ。

参考: http://hsp.tv/play/pforum.php?mode=pastwch&num=55084

// // 特定アプリの起動を検知するためのモジュール(Windows Vista以降で動作) // #module wait_for_app_startup #uselib "psapi.dll" #func EnumProcesses "EnumProcesses" sptr,sptr,sptr #uselib "kernel32.dll" #func OpenProcess "OpenProcess" sptr,sptr,sptr #func CloseHandle "CloseHandle" sptr #func QueryFullProcessImageName "QueryFullProcessImageNameA" sptr,sptr,sptr,sptr #define PROCESS_ALL_ACCESS 0x1F0FFF #deffunc local Init dim pIds pIdCount = 1024 dim returnSize sdim filePath, 260 // MAX_PATH return // 指定アプリが起動するまで待機する // p1 = 起動を待つアプリのファイル名 // 戻り値: 起動したアプリのプロセスID #deffunc WaitForAppStartup str appFileName ret = -1 dim pIdsOld isFirstTime = 1 repeat // 全プロセスのIDを取得 repeat // 列挙 dim pIds, pIdCount EnumProcesses varptr(pIds), varsize(pIds), varptr(returnSize) // 返されたサイズが配列のサイズより小さくなるまで(列挙しきるまで)繰り返す if (returnSize < varsize(pIds)) { pIdCount = returnSize / 4 break } pIdCount ++ loop if (isFirstTime == 0) { repeat pIdCount // 新しいプロセスか判定 isNewProcess = 1 pId = pIds(cnt) repeat length(pIdsOld) if (pId == pIdsOld(cnt)) { isNewProcess = 0 } loop if (isNewProcess == 0) : continue // プロセスの実行ファイルパス取得 filePath = "" size = varsize(filePath) - 1 hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pIds(cnt)) if (hProcess != 0) { QueryFullProcessImageName hProcess, 0, varptr(filePath), varptr(size) } CloseHandle hProcess // ファイル名で、アプリ識別 fileName = getpath(filePath,8) if (fileName == appFileName) { ret = pIds(cnt) break } loop if (ret != -1) : break }else{ isFirstTime = 0 } dim pIdsOld, pIdCount memcpy pIdsOld, pIds, pIdCount * 4 // 1秒周期 wait 100 loop return ret #global Init@wait_for_app_startup /* -------------------- モジュール ここまで -------------------- */ // メモ帳の起動を検知するサンプル mes "Windows標準の「メモ帳」を起動してみてください。" repeat WaitForAppStartup "notepad.exe" mes "メモ帳が起動した (PID:" + stat + ")" loop



zezenana

リンク

2021/10/20(Wed) 07:23:16|NO.94211

起動している実行ウィンドウを調べるなら、APIのFindWindowが使えると思います。
自分はこれで処理対象のプログラムが起動しているかの「簡易」確認を行っています。

以下で「電卓」ウィンドウが起動しているかの確認ができます。
ウィンドウ名はタイトルバーに書かれている文字列です。
なのでウィンドウ名は変化しないことが前提です。

クラス名が無くても確認はできますが、エクスプローラのフォルダ名表示でも
同じウィンドウ名と検知しますのでチェックは必要だと思います。

あくまで「簡易」的なので同じプログラムの複数起動などは判断できません。

実際のプログラム名のクラス名が知りたいのであれば
ウィンドウ名を書き換えてもらえれば不一致にてクラス名がわかると思います。


#include "user32.as" #define FIND_CNAME "ApplicationFrameWindow" #define FIND_WNAME "電卓" WCName="" mes "クラス名  :"+FIND_CNAME mes "ウィンドウ名:"+FIND_WNAME if (FindWindow(FIND_CNAME,FIND_WNAME)) { mes "「"+FIND_WNAME+"」は起動しています(クラス名一致)" } else : if (FindWindow(0,FIND_WNAME)) { GetClassName stat,varptr(WCName),256 mes "「"+FIND_WNAME+"」は起動しています(クラス名不一致)" mes "取得クラス名:"+WCName } else { mes "「"+FIND_WNAME+"」は見つかりません" }



kojui

リンク

2021/10/20(Wed) 07:45:23|NO.94212

皆さんありがとうございます!



MillkeyStars

リンク

2021/10/20(Wed) 09:40:39|NO.94213

すでに解決済みですが、イベントログイベント番号 4688 にて新しいプロセスの起動監視は可能です。
https://docs.microsoft.com/ja-jp/windows/security/threat-protection/auditing/event-4688



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