如何通过映像名称得到窗口句柄?

lile222 2010-09-02 04:46:42
通过窗口名称取得句柄是
\\暴风影音的窗口句柄
HWND TheWindow;
TheWindow = FindWindow(NULL,"media player classic");

那么通过映像名称取得句柄应该怎么写。还拿暴风影音来举例,暴风影音的映像名称是mplayerc.exe,请给出代码。
请不要随便找个地方Ctrl c,然后Ctrl v来回答。
...全文
347 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly4free 2010-09-04
  • 打赏
  • 举报
回复
恩,不要假设 你根据影像名得到的结果 一定就是你所认为的目标程序。
lile222 2010-09-04
  • 打赏
  • 举报
回复
oldforest你写的代码能注解一下吗?我看了有点头晕
jacky_qiu朋友写的没有用到题目中的映像名称啊我都不知道加在什么地方。。
最好能给出具体思路,尽可能详细一些。如:先用XXX函数打开得到进程ID,然后用XXX函数把得到的进程ID再干什么。。
oldforest 2010-09-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lile222 的回复:]
oldforest你写的代码能注解一下吗?我看了有点头晕
jacky_qiu朋友写的没有用到题目中的映像名称啊我都不知道加在什么地方。。
最好能给出具体思路,尽可能详细一些。如:先用XXX函数打开得到进程ID,然后用XXX函数把得到的进程ID再干什么。。
[/Quote]

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 )
}

yyang0514 2010-09-03
  • 打赏
  • 举报
回复
不太明白,mark一下
NIKE霸天虎 2010-09-03
  • 打赏
  • 举报
回复
楼上正解
oldforest 2010-09-02
  • 打赏
  • 举报
回复
OpenProcess后忘了写CloseHandle( hProcess ),你自己加一下
oldforest 2010-09-02
  • 打赏
  • 举报
回复


BOOL CALLBACK GetProcWindowsProc(HWND hwnd, LPARAM lParam)
{
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]);
}
}
}

}
jacky_qiu 2010-09-02
  • 打赏
  • 举报
回复
/****************************************************************************
我这个跟楼上的差不多,但我是先枚举窗口,再比较映射名的
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;
}

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧