ローカル コンピュータで実行されているプロセスではないアプリケーションのハンドルを取得するには?


シークエンサー  2006-10-27 20:02:20  No: 133898

はじめまして、シークエンサーです。

どうしても解決できないことがありまして質問させてください。
アプリ上のボタンをクリックして対象のアプリケーション
(プロセスから特定)をアクティブにし
Sendkeyするプログラムを作成しています。
現在、GetPreviousProcessを使用してExcelを対象には動作するのですが
対象アプリケーションがローカルで動いていない場合プロセスからMainWindowHandleが取得できません。

ローカルで動いていないアプリケーションに対しても値を送信する方法は
ありませんでしょうか?

環境:VisualStudio2003(.NET Framework1.1)
      Windows2000


K.J.K.  2006-10-29 09:32:05  No: 133899

そういうことをするクライアント側のアプリを入れる必要があるのでは。


シークエンサー  2006-10-30 14:27:17  No: 133900

>そういうことをするクライアント側のアプリを入れる必要があるのでは。

と言うことはクラス等は用意されていないと言うことでしょうか?


kit  2006-10-30 14:46:10  No: 133901

sendkeyはできないかもしれないけど、ハンドルはWMIのWin32_Processで取得できます。


シークエンサー  2006-10-31 13:16:47  No: 133902

とりあえずいろいろ調べながらWMIのWin32_Processでハンドルを取る
ようにしてみました。

Dim Procs As Object
For Each Procs In GetObject("winmgmts:").InstancesOf("Win32_Process")
  If UCase(Procs.name) = "対象アプリ" Then
    Console.WriteLine(Procs.Handle)
    Exit For
  End If
Next

SetForegroundWindow(hWnd)のhWndにMainWindowHandleを
与えていたのですが今回取得できたProcs.HandleはIntPtrではないので
渡すことができません。
ためしにSetForegroundWindowの引数をInteger型に変更して
渡したのですが対象アプリが前面に来ません。
String型をIntPtrに変換する方法があるのでしょうか?
それともこのハンドルを渡すこと自体が間違っているのでしょうか?


魔界の仮面弁士  2006-10-31 14:09:50  No: 133903

> For Each Procs In GetObject("winmgmts:").InstancesOf("Win32_Process")
レイトバインド…ですか。
なぜ、System.Management の名前空間を使用しないのでしょう?

> 与えていたのですが今回取得できたProcs.HandleはIntPtrではないので
> 渡すことができません。
Dim x As New IntPtr(ハンドル) で変換できます。

> それともこのハンドルを渡すこと自体が間違っているのでしょうか?
単に「ハンドル」といっても、たとえば プロセスハンドルとか
ウィンドウハンドルとか、デバイスコンテキストハンドルなどなど、
いろいろな種類がありますよね。

ちなみに、Win32_Process.Handle が返す値は
プロセスID(≠プロセスハンドル)です。

> SetForegroundWindow
・SetForegroundWindow でアクティブにするには、幾つかの条件が
  そろっていなければなりませんが、その点は大丈夫ですか?
・SetForegroundWindow を、リモート PC 上ではなく、
  ローカル PC 上から呼び出していませんか?


kit  2006-10-31 14:25:49  No: 133904

HandleとプロセスIDは別で取得できるはずですが。


大吉末吉  2006-10-31 14:39:34  No: 133905

kit さん  こんにちは。

> HandleとプロセスIDは別で取得できるはずですが。

「Doctor Scripto のスクリプト ショップ」
http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0805.mspx

によると、
--------------------------------------------------------------------
Win32_Process の Handle プロパティには、プロセス ID に相当する
文字列データ型の数値が含まれています。
--------------------------------------------------------------------
だそうですけど・・・


kit  2006-10-31 15:02:04  No: 133906

ほんとですね。
同じ値が入ってました。
すみません・・・


シークエンサー  2006-11-01 11:05:22  No: 133907

今回にかんしてはウインドウ名を指定してFindWindowでウインドウハンドルを取得するという方法に変更しなんとか対象アプリにデータを送ることができました。

>レイトバインド…ですか。
>なぜ、System.Management の名前空間を使用しないのでしょう?
すいません、薄い知識で作成したものでぜんぜん内容が理解できてないです。

>・SetForegroundWindow でアクティブにするには、幾つかの条件が
>  そろっていなければなりませんが、その点は大丈夫ですか?
調べた限りでの条件らしきものは満たされていないように思うのですが
今回に関しては動作しているためそこを深くは追求していないです。


>・SetForegroundWindow を、リモート PC 上ではなく、
>  ローカル PC 上から呼び出していませんか?
送信側はローカルのアプリで受信側がローカルではないのでローカル PC 上から呼び出しているんだと思います。
勉強不足名ものでリモート PC 上とかの概念がいまいち理解できません。
なにかそれ用のコーディングが必要と言うことでしょうか?


※作成する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。







   このエントリーをはてなブックマークに追加