• ベストアンサー

WMIを使って、あるプログラムで作成されたクラス名を取得できないでしょうか

VBScriptとWMIを使って、あるクラス名を持つクラスが作成されたことを検知するイベントを作成したいと考えています。 Win32_Processクラスでインスタンスが作成されたときに検知などはできるのですが、どうしてもそこからクラス名を取得したり、作成されたサブクラス名を取得することができません。違うクラスを使ったほうが良いでしょうか。 何か良い方法があれば教えていただけないでしょうか。また、マニュアルで表記されているようであれば、その箇所を教えて頂けると助かります。宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>あつかましいお願いですが、例えばどの言語を使えば可能か教えて頂けないでしょうか。フリーでは難しいものでしょうか。 WindowsAPIを使える言語なら確実です。 WinAPIを使える言語としては、CやC++、VBやDelphiなど。他にもHSPのようにスクリプトでもサポートしているものがあります。 その他の言語についてはわかりません。

papparapa
質問者

お礼

ありがとうございます。早速調べてみます。ご協力ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.3

papparapaさんがいうクラスはウィンドウクラスのことです。 プログラミングをするのであれば、正しい用語を使ってください。 で、ウィンドウクラス名の取得や、ウィンドウクラス名からのウィンドウの特定は、VBScriptとWMIだけでは取得不可能です。 少なからず他の言語を使用する必要があります。

papparapa
質問者

お礼

taka_tetsuさん ありがとうございます。もとから、VBScriptとWMIだけでは無理だったんですね。全然気付いていませんでした。助かりました。 あつかましいお願いですが、例えばどの言語を使えば可能か教えて頂けないでしょうか。フリーでは難しいものでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • bob_n
  • ベストアンサー率35% (610/1732)
回答No.2

ハンドルの数字をカウントアップさせ、クラス名と一致したら、その、数字がハンドルとゆうことがわかるとおもうのですが、ただおなじクラス名があるときがありますが、親子関係をしらべるとか、.... VBScriptとWMIはやってないので、見当違いのことを言っていたらすみません。

全文を見る
すると、全ての回答が全文表示されます。
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

クラスって何のどういったクラスですか? クラスという一般的な言葉では何をしたいかがわかりません。 また、オブジェクト指向であるなら、「クラスが作成された」という言葉自体おかしいです。 「クラスのインスタンスが作成された」ということであれば概念的にはわかりますが、これでも具体的に何をしたいのかはわかりませんので。 ちなみに、papparapaさんが書かれた「インスタンス」についてはWin32_Processって書いてあるんで、Windows上のプロセスということは判断つきますが。

papparapa
質問者

補足

すいません 確かにクラスのインスタンスが作成されたというのが正しいように思います。正確に説明できるか自信がなく、具体的に書かせて頂きます。 アプリケーションを起動するとウィンドウがでて「はい」「いいえ」を選ぶようになっています。 SendKeysを使って「はい」を選択します。 そうしますと、このアプリがある操作を行うのですが、この操作が終わる時間が一定ではありません。 操作終了後、ウィンドウが開いてそこで「1」「2」「3」と選ぶようになっています。 ここでこのウィンドウにタイトルと言いますか、「Internet Exploer」というような文言が表示されず、空白のタイトルなのです。しかし、Winspectorを使ってこのアプリを見たところ、ウィンドウの中にさらにウィンドウがあって(親ウィンドウ、子ウィンドウという感じです)、この子ウィンドウのclass nameが特定の文言になっているんです。 この特定の文言に対応するかたちで、スクリプトを走らせたいと考えています。 うまく説明できているかわかりませんが、引き続き宜しくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クラスのインスタンス名をクラス内で取得できますか?

    クラスのインスタンス名をクラス内で取得できますか? 今VC++6.0を使っています。例として下記のクラスのコンストラクタで CTest::CTest() { TRACE("%s",typeid(this).name()); } としておいて、 別なクラスで CTest testInst; を生成すると デバッグエリアに 「class CTest *」 と表示することはできました。 これが出来るのなら、インスタンス名 testInst をCTestクラスの内部から 取得することは出来ないのかと思ったのですが、 取得することは可能なのでしょうか?

  • 起動しているアプリケーション一覧を取得したい

    VBScript等にて、起動しているアプリケーション一覧(タスクマネージャのアプリケーションタグに表示されている)を取得したい 環境は、XPです。 よろしくお願いします。 ※WMIのWin32_Processには、見当たりませんでした

  • VBSからbat実行(WMI)して戻り値を取得する

    WSH初心者です。 WSH(remote.vbs)からWMI使用で別サーバのA.batを実行しているのですが、 A.batの戻り値はどのように取得すれば良いのでしょうか? -■remote.vbs(一部抜粋)------------------------------------------ ' #WMI に接続 Wim32_Process クラスを取り出す Set clsProcess = GetObject("winmgmts:{impersonationLevel=impersonate}" & "!" & リモート先PC & "Win32_Process") ' #プロセスの作成 lngResult = clsProcess.Create(A.bat, null, null, processId) -------------------------------------------------------------- -■A.bat------------------------------------------ exit /B %RetCode% ------------------------------------------------- A.batで返している%RetCode%の値をremote.vbs側で取得したいのです。 どなたかご存じでしたらご教授の程よろしくお願い致します。

  • クラスでスレッド作成

    VC++2008Express WIN32APIでRS232Cの通信用クラスを作成しています。 RS232Cの受信用スレッドを作成して 1ポートの受信処理をするようにはできます。 ですが ポート追加するたびにクラスをインスタンス化して受信用スレッドを 作成したいのですが、スレッド作成するには使用する変数などを staticにしないといけないため、クラスを複数インスタンス化できません。 どのような手法でクラスから複数スレッドを作成することができるのでしょうか? 分かりにくい説明ですが、参考になるものなどありましたら、 よろしくお願いします。

  • 一番深度が深いインスタンス名の取得

    actionscript3.0で作成しております。 一番深度が深いインスタンス名を取得したいのですが、どのようにすれば よいのでしょうか?

    • ベストアンサー
    • Flash
  • Windowsのコンピューター名等を取得するプログラム

    お世話になります。 IPアドレスのみがわかっているリモートのWindowsマシン(対象はWin98以上、できればWin95も)の情報を取得する方法を探しています。 ●取得したい情報 ・コンピュータ名 ・Windowsの種類(98や2000、XP) ・Windowsにログインしているユーザー名 これらの情報を取得するためにはどの言語(C,VB,VBScript,JScript他なんでも可)でどんな手順(触りの部分でもかまいません)を使えば実現できるでしょうか? コマンドを実行して出力の内容を整形するというようなことでもOKです。その場合どんなコマンドを使えばよいか示して頂ければと思います。 例えばコンピューター名だったら”nbtstat- A IPアドレス”の結果から取得するなど。 ※リモートのWindowsには何も追加インストールをしない仕組みが良いです。

  • クラス内のメンバ関数から他クラスのメンバ関数を利用

    PHP 5.3.8で、 MySQLデータベースに関する処理をする Database クラスと、ファイルのアップロード処理をする FileUpload クラスがあったとして、ファイルのアップロードが完了したら、そのファイル名をデータベースに書き込む処理をしたいと思っています。 思いつく方法としては、FileUpload クラスの関数内で逐一Databaseクラスをインスタンス化するか、予めインスタンス化したものをグローバル変数として利用するか、Databaseに対するサブクラスとしてFileUploadをextendsするなどがあるとは思いますが、どういうやり方をすれば綺麗にまとまるのか教えて下さい。 あまりクラスに関する知識がないので一般的にどうするかがよくわかっていない状態です。

    • ベストアンサー
    • PHP
  • WMIでのプロセスの起動・終了監視について

    WMIでのプロセスの起動・終了監視について ●環境 Microsoft VC++ 6.0 Windows XP Pro ●質問 http://mrxray.on.coocan.jp/Delphi/plSamples/902_WMI_ProcessCreateTerminate.htm の「04_プロセス(アプリケーション)の起動と終了を監視」を参考に、VCに置き換えて作成したのですが途中で詰まってしまいました。 get_Classによる取得までできて、プロセスの作成・終了までは分かるようになったのですが そのプロセスの情報が取得できません(プロセスIDや名前など)、参考にしたページ(Delphi)ではTargetInstanceから取得できるようなのですが、VCではそのプロパティ(?)が見つからず情報を取得出来ませんでした どうすれば、プロセスの情報を取得出来るのでしょうか? よろしくお願いします。 ●ソース _COM_SMARTPTR_TYPEDEF(ISWbemEventSource, __uuidof(ISWbemEventSource)); _COM_SMARTPTR_TYPEDEF(ISWbemObject, __uuidof(ISWbemObject)); _COM_SMARTPTR_TYPEDEF(ISWbemObjectPath, __uuidof(ISWbemObjectPath)); ISWbemEventSourcePtr SWbemEventSourcePtr; hResult = SWbemServices->ExecNotificationQuery(_bstr_t(L"SELECT * FROM __InstanceOperationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"), _bstr_t(L"WQL"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &SWbemEventSourcePtr); while(TRUE) { ISWbemObjectPtr SWbemObjectPtr; hResult = SWbemEventSourcePtr->NextEvent(-1, &SWbemObjectPtr); CString ccc; { ISWbemObjectPathPtr SWbemObjectPathPtr; hResult = SWbemObjectPtr->get_Path_(&SWbemObjectPathPtr); CComBSTR ClassString; hResult = SWbemObjectPathPtr->get_Class(&ClassString); ccc = ClassString; } ■■■ここでプロセスに関する情報を取得したい■■■ if(ccc == "__InstanceCreationEvent"){ // プロセス作成 } else if(ccc == "__InstanceDeletionEvent"){ // プロセス終了 } }

  • Dimensionクラスの使い方

    Javaを始めたばかりの者です。 参考書を読みながら進めていて下記のソースコードで Dimensionクラスを使用している箇所で行き詰まりました。 使われていたのは、以下のコード --------------------------------------------------------------------------------------------------------------------- import java.awt.*; import javax.swing.*; import java.util.*; class xxx{  static public void main(String[] argv){  /*標準入力からmsgに文字列を入力*/  String msg = scan.next();  /*JLabelクラス型のオブジェクト型変数を作成し、インスタンスを生成*/  JLabel label = new JLabel(msg);  /*JLabelのインスタンスのコンストラクタに入力されたmsgのサイズを取得*/  Dimension dim = label.getPreferredSize();  ・・・etc  } } ---------------------------------------------------------------------------------------------------------------------- 自分が今まで使ってきたクラスは下記のような感じで使っていましたが、ここではnewしていない。 これは、どういうことなんでしょうか? クラス名 dim = new クラス名(); インスタンス作成 = コンストラクタの呼び出し。 new演算子はクラスのコンストラクタを呼び出している理解ですが Dimension dim = label.getPreferredSize(); 上記のコードではDimentionクラスのインスタンスは作られていないということだと思います。 ということは、 ここでは何をしているのでしょうか? どなたか、教えて下さい。

    • ベストアンサー
    • Java
  • XPEmbeddedによるWMI利用について

    WMIを利用したソフトをVBで作っていますが、XPEmbeddedにて実行すると 「ActiveXコンポーネントを作成できませんでした」 ( ActiveX component Can't create object) とエラーがでます。 //////エラー箇所/////  Set Locator = New WbemScripting.SWbemLocator ・・・VB6で開発した場合  Set Locator = WScript.CreateObject("WbemScripting.SWbemLocator") ・・・VBSで実行した場合 wbemtest.exeでWMIテスターによる各種情報取得はできるのは確認しました。 XPEmbeddedでWMIを利用する際は、他に何かしなければいけないのでしょうか? 対処法があれば教えて頂ければ幸いです。