PIDとHWNDの変換(C#/VB.NET)
2010年09月19日
他のアプリケーション(EXE)に対してメッセージ(操作/制御する命令)を送る時に必要になるのがウィンドウハンドル(HWND)です。ウィンドウハンドル(HWND)からプロセスID(PID)に変換する方法はGetWindowThreadProcessIdで簡単ですが、プロセスID(PID)からウィンドウハンドル(HWND)に変換する方法は少々難しいです。
プロセスID(PID)とウィンドウハンドル(HWND)を相互変換するサンプル(ソース/コード)を以下に記述します。
' -----------------------------------------------------------
' プロセスIDとウィンドウハンドルの変換(VB.NET/VS2005)
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
' TextBox1にPIDを入力して動作確認
' プロセスID(pid)をウィンドウハンドル(hwnd)に変換する
TextBox2.Text = GetHwndFromPid(TextBox1.Text)
' ウィンドウハンドル(hwnd)をプロセスID(pid)に変換する
TextBox3.Text = GetPidFromHwnd(TextBox2.Text)
End Sub
Private Const GW_HWNDNEXT = 2
<DllImport("user32")> _
Private Shared Function GetParent( _
ByVal hwnd As Integer) As Integer
End Function
<DllImport("user32")> _
Private Shared Function GetWindow( _
ByVal hwnd As Integer, _
ByVal wCmd As Integer) As Integer
End Function
<DllImport("user32")> _
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Integer
End Function
<DllImport("user32")> _
Private Shared Function GetWindowThreadProcessId( _
ByVal hwnd As Integer, _
ByRef lpdwprocessid As Integer) As Integer
End Function
<DllImport("user32")> _
Private Shared Function IsWindowVisible( _
ByVal hwnd As Integer) As Integer
End Function
' プロセスID(pid)をウィンドウハンドル(hwnd)に変換する
Public Function GetHwndFromPid( _
ByVal pid As Integer) As Integer
Dim hwnd As Integer
hwnd = FindWindow(vbNullString, vbNullString)
Do While hwnd <> 0
If GetParent(hwnd) = 0 And _
IsWindowVisible(hwnd) <> 0 Then
If pid = GetPidFromHwnd(hwnd) Then
Return hwnd
End If
End If
hwnd = GetWindow(hwnd, GW_HWNDNEXT)
Loop
Return hwnd
End Function
' ウィンドウハンドル(hwnd)をプロセスID(pid)に変換する
Public Function GetPidFromHwnd( _
ByVal hwnd As Integer) As Integer
Dim pid As Integer
Call GetWindowThreadProcessId(hwnd, pid)
GetPidFromHwnd = pid
End Function
' -----------------------------------------------------------
// ----------------------------------------------------------
// プロセスIDとウィンドウハンドルの変換(C#.NET/VS2005)
private void Button1_Click(object sender, EventArgs e)
{
// TextBox1にPIDを入力して動作確認
// プロセスID(pid)をウィンドウハンドル(hwnd)に変換する
TextBox2.Text =
GetHwndFromPid(int.Parse(TextBox1.Text)).ToString();
// ウィンドウハンドル(hwnd)をプロセスID(pid)に変換する
TextBox3.Text =
GetPidFromHwnd(int.Parse(TextBox2.Text)).ToString();
}
private const int GW_HWNDNEXT = 2;
[DllImport("user32")]
private extern static int GetParent(int hwnd);
[DllImport("user32")]
private extern static int GetWindow(int hwnd, int wCmd);
[DllImport("user32")]
private extern static int FindWindow(
String lpClassName, String lpWindowName);
[DllImport("user32")]
private extern static int GetWindowThreadProcessId(
int hwnd, out int lpdwprocessid);
[DllImport("user32")]
private extern static int IsWindowVisible(int hwnd);
// プロセスID(pid)をウィンドウハンドル(hwnd)に変換する
public int GetHwndFromPid(int pid)
{
int hwnd;
hwnd = FindWindow(null, null);
while (hwnd != 0)
{
if (GetParent(hwnd) == 0 &&
IsWindowVisible(hwnd) != 0)
{
if (pid == GetPidFromHwnd(hwnd))
{
return hwnd;
}
}
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
return hwnd;
}
// ウィンドウハンドル(hwnd)をプロセスID(pid)に変換する
public int GetPidFromHwnd(int hwnd)
{
int pid;
GetWindowThreadProcessId(hwnd, out pid);
return pid;
}
// ----------------------------------------------------------
スポンサーサイト