-
June 28th, 2006, 11:24 AM
#1
[RESOLVED] How to get window's HWND from it's process handle?
Hi there,
How can I get the HWND of a window from it's process handle? I'm looking for some way other then GetProcessID because it is supported only for WinXP systems.
Or, if anyone can tell how can I do the reverse, how can I get the process handle from HWND of a window.
Basically what I'm trying is to detect if an app is running and then get the handle to it's window.
Thanks.
"I rather not play football than wear Nerrazzuri shirt" - Paolo Maldini
FORZA MILAN!!!
-
June 28th, 2006, 11:42 AM
#2
Re: How to get window's HWND from it's process handle?
I guess it could be done the same way as explained in HOWTO: Terminate an Application "Cleanly" in Win32
BTW, What are you trying to accomplish?
-
June 28th, 2006, 02:21 PM
#3
Re: How to get window's HWND from it's process handle?
Victor, the link you gave tells how to end a process given you have it's process ID. And, getting the process ID is what I'm looking for.
What I'm trying is to check whether an app, say notepad, is running. If yes then my application would take a screenshot of it. I'm able to determine whether an app is running by using EnumProcesses, now I want to get the process ID of it. With the process ID I would use EnumWindows and call on GetWindowThreadProcessId to search for the window of the process.
"I rather not play football than wear Nerrazzuri shirt" - Paolo Maldini
FORZA MILAN!!!
-
June 28th, 2006, 02:43 PM
#4
Re: How to get window's HWND from it's process handle?
I am confused about what you know and what you still need to know. Some of your statements seem to be contradicting, so I will tell you some possibilities:
1)
HAVE: Process ID, NEED: Process handle
Solution: OpenProcess()
2)
HAVE: Process handle, NEED: Process ID
Solution: GetProcessId()
3)
HAVE: Window handle, NEED: Process ID
Solution: GetWindowThreadProcessId()
4)
HAVE: Window handle, NEED: Process handle
Solution: Use 3) and then 1)
5)
HAVE: Process ID, NEED: Window handle
Solution: EnumWindows(), then in the callback function do 3) and check if it matches your process ID.
6)
HAVE: Process handle, NEED: Window handle
Solution: 2) and then 5)
Please don't forget to rate users who helped you!
-
June 28th, 2006, 05:20 PM
#5
Re: How to get window's HWND from it's process handle?
Yeah...I was a little dizzy. The solution was always in front of me . With EnumProcesses I got the process ID's thus there is no need of GetProcessID (what was I thinking before).
Victor, Phil, thanks for the help.
And, it's 3:45 AM in this part of the world and I better catch some sleep.
Gute Nacht .
"I rather not play football than wear Nerrazzuri shirt" - Paolo Maldini
FORZA MILAN!!!
-
June 21st, 2010, 03:15 PM
#6
Re: [RESOLVED] How to get window's HWND from it's process handle?
Hello!
I used the way prescribed here. Firstable I found all processes ID's. Becasue I need to identify specific one, I wanted to do it by it's name. Unfortunately it's <uknown> (see code). So, I enumerated all windows and got thei ID's for each process, and compared with it's ID. It turns out, thath none of them matches. What is the solution?
Here is code:
Code:
#include <stdafx.h>
#include <windows.h>
#include <stdio.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
DWORD processId;
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)
{
//if(!hwnd) return false;
DWORD id=GetWindowThreadProcessId(hwnd,&id);
printf("process id: %d %d\n", id, processId);
if(id==processId)
{
printf("THEY MATCH!process id: %d\n", id);
char buffer[256];
GetWindowText(hwnd,(LPWSTR)buffer,255);
printf("%s ", buffer);
}
return true;
}
void PrintProcessNameAndID( DWORD processID )
{
processId=processID;
TCHAR szProcessName[256] = TEXT("<unknown>");
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
// Get the process name.
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
EnumWindows(&EnumWindowsProc,NULL);
// Print the process name and identifier.
_tprintf( TEXT("%s (PID: %u)\n"), szProcessName, processID );
CloseHandle( hProcess );
system("PAUSE");
}
int main()
{
// Get the list of process identifiers.
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return 0;
// Calculate how many process identifiers were returned.
cProcesses = cbNeeded / sizeof(DWORD);
// Print the name and process identifier for each process.
for ( i = 0; i < cProcesses; i++ )
if( aProcesses[i] != 0 )
PrintProcessNameAndID( aProcesses[i] );
return 0;
}
-
June 22nd, 2010, 02:40 AM
#7
Re: [RESOLVED] How to get window's HWND from it's process handle?
I have no time to test/revise your code, but this lie seems to be wrong:
Originally Posted by Pablosz
Code:
...
DWORD processId;
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM lparam)
{
//if(!hwnd) return false;
DWORD id=GetWindowThreadProcessId(hwnd,&id);
....
}
Why are you using the same variable for both thread and process IDs?
Didn't you read the documentation of GetWindowThreadProcessId Function?
Victor Nijegorodov
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|