[リストへもどる]
一括表示

投稿時間:2004/06/30(Wed) 09:42
投稿者名:風来坊
Eメール:
URL :
タイトル:
ウィンドウのクラス名からプロセスハンドルの取得
現在,ウィンドウのクラス名からプロセスハンドルを取得して
それを元に更にいろいろやるプログラムを作りたいと考えたのですが….
一番始めでつまずいてしまったので,どこが悪いのか指摘してもらえると助かります.

作成中のソースを載せますが,ここでは例として電卓(SciCalc)でやりました.

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, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
     ByVal dwProcessId As Long) As Long

Private Sub Command1_Click()
    Dim hWnd As Long
    Dim lngPID As Long
    Dim lngHandle As Long
    
    hWnd = FindWindow("SciCalc", vbNullString)
    Text1.Text = hWnd
    If hWnd <> 0 Then
        Call GetWindowThreadProcessId(hWnd, lngPID)
        Text2.Text = Hex(lngPID) & " and " & lngPID
    Else
        Text2.Text = "見つかりません!"
    End If
  lngHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lngPID)
  Text3.Text = Hex(lngHandle)
End Sub

このプログラムでFindWindowでウィンドウのハンドルを取得して,
ウィンドウハンドルからGetWindowThreadProcessIdでプロセスIDを取得してます.
ここまでは上手くいっているのですが,
プロセスIDからOpenProcessでプロセスハンドルを取得しようとした場合に,
lngHandleの値がいつも"0"になってしまいます.

思い当たる所は試したつもりなのですが,上手くいかないので
アドバイスをお願いいたします.

投稿時間:2004/06/30(Wed) 11:58
投稿者名:ei
Eメール:
URL :
タイトル:
Re: ウィンドウのクラス名からプロセスハンドルの取得
>   lngHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lngPID)

PROCESS_ALL_ACCESSがEmptyになってないですか?
実際の値としては「2035711」になります。

下記の様に宣言してみて下さい。
Public Const STANDARD_RIGHTS_REQUIRED   As Long = &HF0000
Public Const SYNCHRONIZE                As Long = &H100000
Public Const PROCESS_TERMINATE          As Long = &H1&
Public Const PROCESS_CREATE_THREAD      As Long = &H2&
Public Const PROCESS_VM_OPERATION       As Long = &H8&
Public Const PROCESS_VM_READ            As Long = &H10&
Public Const PROCESS_VM_WRITE           As Long = &H206
Public Const PROCESS_DUP_HANDLE         As Long = &H40&
Public Const PROCESS_CREATE_PROCESS     As Long = &H80&
Public Const PROCESS_SET_QUOTA          As Long = &H100&
Public Const PROCESS_SET_INFORMATION    As Long = &H200&
Public Const PROCESS_QUERY_INFORMATION  As Long = &H400&
Public Const PROCESS_ALL_ACCESS         As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)

投稿時間:2004/07/01(Thu) 00:21
投稿者名:風来坊
Eメール:
URL :
タイトル:
Re^2: ウィンドウのクラス名からプロセスハンドルの取得
> >   lngHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lngPID)
>
> PROCESS_ALL_ACCESSがEmptyになってないですか?
> 実際の値としては「2035711」になります。

ご指摘の通り,emptyになっていました.
きちんと宣言して無事動作確認できました.
ei様どうもありがとうございました.