FC2ブログ

トップ  >  サンプルソース  >  PIDとHWNDの変換(C#/VB.NET)

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;
}
// ----------------------------------------------------------
スポンサーサイト

ショートカット作成(C#/VB.NET) | トップページへ戻る | Windows7 未署名ドライバ

このページのトップに戻る

コメント

名前
題名
メールアドレス
WEBサイト
 
コメント
パスワード
  管理者にだけ表示を許可する

このページのトップに戻る

トラックバック

このページのトップに戻る