通过窗口名称取得句柄是
\\暴风影音的窗口句柄
HWND TheWindow;
TheWindow = FindWindow(NULL,"media player classic");那么通过映像名称取得句柄应该怎么写。还拿暴风影音来举例,暴风影音的映像名称是mplayerc.exe,请给出代码。
请不要随便找个地方Ctrl c,然后Ctrl v来回答。
\\暴风影音的窗口句柄
HWND TheWindow;
TheWindow = FindWindow(NULL,"media player classic");那么通过映像名称取得句柄应该怎么写。还拿暴风影音来举例,暴风影音的映像名称是mplayerc.exe,请给出代码。
请不要随便找个地方Ctrl c,然后Ctrl v来回答。
{
DWORD dwProcId = 0;
if (GetWindowThreadProcessId(hwnd, &dwProcId))
{
if (dwProcId == lParam)
{
//得到该窗口句柄
dosomething...
return FALSE;
}
}
return TRUE;
}
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
TCHAR szMyProc[] = L"mplayerc.exe"; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;
cProcesses = cbNeeded / sizeof(DWORD);
for ( i = 0; i < cProcesses; i++ )
{
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, aProcesses[i] );
if (NULL != hProcess )
{
DWORD dwRet = 0;
TCHAR szProcessName[MAX_PATH] = L"unknown";
dwRet = GetProcessImageFileName(hProcess,szProcessName,MAX_PATH);
if (0!=dwRet)
{
CString strProcName = szProcessName;
CString strTemp = strProcName.Right(wcslen(szMyProc));
if (!strTemp.Compare(szMyProc))
{
EnumWindows(GetProcWindowsProc,aProcesses[i]);
}
}
} }
我这个跟楼上的差不多,但我是先枚举窗口,再比较映射名的
1.以下的方法是通过枚举窗口找到具有映射名的窗口,但窗口不只一个,你再自己判断一下是哪个吧
2.愿顺利。阿弥陀佛!
****************************************************************************/
步骤一:
#pragma comment(lib,"psapi")
#include "PSAPI.H"
步骤二:
枚举所以窗口
BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)
{
if ( GetParent(hWnd)==NULL && IsWindowVisible(hWnd) )
{
DWORD dwProcId; //进程ID
GetWindowThreadProcessId(hWnd, &dwProcId); //由窗口句柄获得进程ID
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE, dwProcId); TCHAR szProcessName[MAX_PATH] ={0}; //进程的名称
TCHAR szProcessPath[MAX_PATH] ={0}; //进程路径 if (hProcess!=NULL)
{
HMODULE hMod=NULL;
DWORD ModulecbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &ModulecbNeeded) )
{ if ( GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName) ) //获得程序名
&& GetModuleFileNameEx( hProcess, hMod, szProcessPath, sizeof(szProcessPath)) )//获得模块路径
{
// trace2(szProcessPath,szProcessName);
//在这里我们获取了一个或更多个窗口,他们都属于名为szProcessName的进程
//剩下的工作你就自己判断这几个窗口哪个才是主窗口
if ( 0==strcmp((char*)lParam,szProcessName) )
{
trace(szProcessName);// CloseHandle(hProcess);
// return FALSE;
}
}
}
}
CloseHandle(hProcess);
}
return true;
}
jacky_qiu朋友写的没有用到题目中的映像名称啊我都不知道加在什么地方。。
最好能给出具体思路,尽可能详细一些。如:先用XXX函数打开得到进程ID,然后用XXX函数把得到的进程ID再干什么。。
DWORD aProcesses[1024], cbNeeded, cProcesses;
unsigned int i;
TCHAR szMyProc[] = L"mplayerc.exe"; //枚举所有的进程
if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
return;
cProcesses = cbNeeded / sizeof(DWORD);
for ( i = 0; i < cProcesses; i++ )
{
//打开每个进程,判断进程映象名是否和mplayerc.exe相匹配
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, aProcesses[i] );
if (NULL != hProcess )
{
DWORD dwRet = 0;
TCHAR szProcessName[MAX_PATH] = L"unknown";
dwRet = GetProcessImageFileName(hProcess,szProcessName,MAX_PATH);
if (0!=dwRet)
{
CString strProcName = szProcessName;
CString strTemp = strProcName.Right(wcslen(szMyProc));
if (!strTemp.Compare(szMyProc))
{
//找到和mplayerc.exe相匹配的的进程,接下来枚举系统中所有窗口,
//并判断窗口所在的进程和所找到的进程是否是同一个
EnumWindows(GetProcWindowsProc,aProcesses[i]);
}
}
}
CloseHandle( hProcess )
}