DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロセスIDからウィンドウハンドル

環境/言語:[win7 64bit vb2008EE]
分類:[.NET]

下記HPを見て、プロセスIDからウィンドウハンドルをつかもうとしたのですが。
x86でビルドすると0が帰ってきてしまいます。
他ライブラリの関係上 x86でのビルドが必須となるのですが。
64bit環境だとこの方法ではだめなのでしょうか?

http://homepage2.nifty.com/nonnon/Win32Api/Win32ApiEtc.html


Private Const GW_HWNDNEXT = 2
Private Declare Function GetParent Lib "user32" _
(ByVal hwnd As Long) As Long
Private Declare Function GetWindow Lib "user32" _
(ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" _
(ByVal hwnd As Long, ByRef lpdwprocessid As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" _
(ByVal hwnd As Long) As Long

' プロセスID(pid)をウィンドウハンドル(hwnd)に変換する
Public Function GetHwndFromPid(ByVal pid As Long) As Long
Dim hwnd As Long
hwnd = FindWindow(vbNullString, vbNullString)
Do Until hwnd = 0
If GetParent(hwnd) = 0 And IsWindowVisible(hwnd) <> 0 Then
If pid = GetPidFromHwnd(hwnd) Then
GetHwndFromPid = hwnd
Exit Do
End If
End If
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop
End Function

' ウィンドウハンドル(hwnd)をプロセスID(pid)に変換する
Public Function GetPidFromHwnd(ByVal hwnd As Long) As Long
Dim pid As Long
Call GetWindowThreadProcessId(hwnd, pid)
GetPidFromHwnd = pid
End Function
2012/04/17(Tue) 07:07:07 編集(投稿者)

VB2008 という前提が正しいとすると Declare 文が正しくありません。
VB6 のサンプルはそのまま利用できないと思ってください。

・Long 型は 8 バイトです。API の元の宣言を確かめてください。
 http://msdn.microsoft.com/ja-jp/library/cc364779.aspx など。
 8 バイトの型になっていませんよね?
 もしくは、下のようなサイトを利用するとか。
 http://www.pinvoke.net/default.aspx/user32.getwindowthreadprocessid

・ウィンドウハンドルなどのポインタ相当の型は IntPtr 型にしてください。
 ウィンドウハンドルなどは x86 ビルドでは 4 バイト、x64 ビルドでは 8 バイトになります。IntPtr 型はその違いを吸収してくれます。
■No30335に返信(ららさんの記事)
> プロセスIDからウィンドウハンドルをつかもうとしたのですが。

Dim hwnd As IntPtr = Process.GetProcessById( procId ).MainWindowHandle

で取得できませんか?
Azuleanさん  魔界の仮面弁士さん
お二人ともありがとうございました。

Azuleanさん 大変勉強になりました。 そういうことだったんですね
魔界の仮面弁士さん こんな簡単なことに気づかなかったのにおしえていただきありがとうございました。
魔界の仮面弁士さんの方法でうまくいきました。 本当にありがとうございました



■No30337に返信(魔界の仮面弁士さんの記事)
> ■No30335に返信(ららさんの記事)
>>プロセスIDからウィンドウハンドルをつかもうとしたのですが。
>
> Dim hwnd As IntPtr = Process.GetProcessById( procId ).MainWindowHandle
>
> で取得できませんか?
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板