はじめまして、シークエンサーです。
どうしても解決できないことがありまして質問させてください。
アプリ上のボタンをクリックして対象のアプリケーション
(プロセスから特定)をアクティブにし
Sendkeyするプログラムを作成しています。
現在、GetPreviousProcessを使用してExcelを対象には動作するのですが
対象アプリケーションがローカルで動いていない場合プロセスからMainWindowHandleが取得できません。
ローカルで動いていないアプリケーションに対しても値を送信する方法は
ありませんでしょうか?
環境:VisualStudio2003(.NET Framework1.1)
Windows2000
そういうことをするクライアント側のアプリを入れる必要があるのでは。
>そういうことをするクライアント側のアプリを入れる必要があるのでは。
と言うことはクラス等は用意されていないと言うことでしょうか?
sendkeyはできないかもしれないけど、ハンドルはWMIのWin32_Processで取得できます。
とりあえずいろいろ調べながら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に変換する方法があるのでしょうか?
それともこのハンドルを渡すこと自体が間違っているのでしょうか?
> 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 上から呼び出していませんか?
HandleとプロセスIDは別で取得できるはずですが。
kit さん こんにちは。
> HandleとプロセスIDは別で取得できるはずですが。
「Doctor Scripto のスクリプト ショップ」
(http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0805.mspx)
によると、
--------------------------------------------------------------------
Win32_Process の Handle プロパティには、プロセス ID に相当する
文字列データ型の数値が含まれています。
--------------------------------------------------------------------
だそうですけど・・・
ほんとですね。
同じ値が入ってました。
すみません・・・
今回にかんしてはウインドウ名を指定してFindWindowでウインドウハンドルを取得するという方法に変更しなんとか対象アプリにデータを送ることができました。
>レイトバインド…ですか。
>なぜ、System.Management の名前空間を使用しないのでしょう?
すいません、薄い知識で作成したものでぜんぜん内容が理解できてないです。
>・SetForegroundWindow でアクティブにするには、幾つかの条件が
> そろっていなければなりませんが、その点は大丈夫ですか?
調べた限りでの条件らしきものは満たされていないように思うのですが
今回に関しては動作しているためそこを深くは追求していないです。
>・SetForegroundWindow を、リモート PC 上ではなく、
> ローカル PC 上から呼び出していませんか?
送信側はローカルのアプリで受信側がローカルではないのでローカル PC 上から呼び出しているんだと思います。
勉強不足名ものでリモート PC 上とかの概念がいまいち理解できません。
なにかそれ用のコーディングが必要と言うことでしょうか?
| ツイート |
|