Question

I tried to get hWnd from current process using GetCurrentProcess function to display path to each process. But I got an error in this line: User32.INSTANCE.GetWindowThreadProcessId(hWnd, pid); How to convert it to the desired type?

The method GetWindowThreadProcessId(WinDef.HWND, IntByReference) in the type User32 is not applicable for the arguments (WinNT.HANDLE, IntByReference)

There is my code:

try {
    while (kernel32.Process32Next(snapshot, processEntry)) {
        kernel32.GetCurrentProcess();
        HANDLE hWnd = kernel32.GetCurrentProcess();
        User32.INSTANCE.GetWindowThreadProcessId(hWnd, pid);

        HANDLE process = Kernel32.INSTANCE.OpenProcess(0x0400 | 0x0010,
                false, pid.getValue());
        psapi.GetModuleFileNameExA(process, null, path, 1024);

        System.out.println(Native.toString(path));
    }
} finally {
    kernel32.CloseHandle(snapshot);
}

UPD: The problem was solved in this way:

try {
    while (kernel32.Process32Next(snapshot, processEntry)) {

        HANDLE process = Kernel32.INSTANCE.OpenProcess(0x0400 | 0x0010,
                false, processEntry.th32ProcessID.intValue());
        if (process != null) {
            int len = psapi.GetModuleFileNameExW(process, null, path,
                    1024);
            if (len > 0) {
                System.out.println(new String(path, 0, len));
            } else {
                System.out.println("GetModuleFileNameW failed");
            }
        } else {
            System.out.println(kernel32.GetLastError());
        }
        System.out.println(process != null ? Native.toString(path) : "error");
    }
} finally {
    kernel32.CloseHandle(snapshot);
}

Thank you for help!

Was it helpful?

Solution

A) get a list of Process Identifiers (PID) using the Win32 API EnumProcesses or the Win32 APIs CreateToolhelp32Snapshot / Process32First / Process32Next / CloseHandle

B) with each PID, use the win32 API OpenProcess to obtain a HANDLE for the process (request for PROCESS_QUERY_INFORMATION as dwDesiredAccess). With that handle, use the Win32 API GetProcessImageFileName (and do not forget to close the HANDLE with CloseHandle)

Hope this helps (as that's not JAVA code, sorry for that)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top