如何获取一个可执行文件运行时的 HWND?

ra3 2004-03-30 12:10:21
比如一个可执行文件 abc.exe 该程序运行时会有一个窗体
可以通过可执行文件的名称获取其运行时的 HWND吗?
...全文
140 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2004-08-17
  • 打赏
  • 举报
回复
MARK
xuanzg 2004-03-30
  • 打赏
  • 举报
回复
上面 1 2,那个你弄不通 可以再问我。
xuanzg 2004-03-30
  • 打赏
  • 举报
回复
1.遍历进程,查找abc.exe 进程id and 句柄
2.通过进程句柄,找到窗口句柄
王国凡 2004-03-30
  • 打赏
  • 举报
回复
根据其 Class 或者窗口标题可以得到:

HWND FindWindow(
LPCTSTR lpClassName, // class name
LPCTSTR lpWindowName // window name
);
薛定谔之死猫 2004-03-30
  • 打赏
  • 举报
回复
关注
xuanzg 2004-03-30
  • 打赏
  • 举报
回复
找到进程,发送消息


void SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation,
UINT Msg, WPARAM wParam, LPARAM lParam);
static BOOL CALLBACK EnumWindowCallBack(HWND hwnd, LPARAM lParam);


void CMyWinApp:: SendMessageToProcess(LPPROCESS_INFORMATION lpProcessInformation,
UINT Msg, WPARAM wParam, LPARAM lParam)
{
FINDWINDOWHANDLESTRUCT fwhs;
fwhs.ProcessInfo = lpProcessInformation;
fwhs.hWndFound = NULL;

EnumWindows ( EnumWindowCallBack, (LPARAM)&fwhs ) ;

SendMessage ( fwhs.hWndFound, Msg, wParam, lParam );
}

CMyWinApp::EnumWindowCallBack(HWND hwnd, LPARAM lParam)
{
FINDWINDOWHANDLESTRUCT * pfwhs = (FINDWINDOWHANDLESTRUCT * )lParam;
DWORD ProcessId;
CString Title;
GetWindowThreadProcessId ( hwnd, &ProcessId );

CWnd::FromHandle( hwnd )->GetWindowText(Title);
if ( ProcessId == pfwhs->ProcessInfo->dwProcessId && Title.GetLength() != 0)
{
pfwhs->hWndFound = hwnd;
return false;
}
else
{
// Keep enumerating
return true;
}
}

xuanzg 2004-03-30
  • 打赏
  • 举报
回复
查找进程:

BOOL FindProc(LPCSTR appName)
{
PROCESSENTRY32 ProcEntry;
BOOL isExist(0);

HANDLE hproc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
memset(&ProcEntry, 0, sizeof(ProcEntry));
ProcEntry.dwSize = sizeof(ProcEntry);
ProcEntry.cntUsage = 1;

strcpy(ProcEntry.szExeFile, "hh.exe");

if(Process32First(hproc, &ProcEntry))
{
for(;;)
{
if(!Process32Next(hproc, &ProcEntry))
break;
// HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,TRUE,info->th32ProcessID);

char lpFileName[256] = {0};
HANDLE hProcess =
OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
ProcEntry.th32ProcessID
);
//得到进程完全路径
if(NULL != hProcess)
{
HMODULE hMod;
DWORD cbNeeded;

//得到模块句柄
if( EnumProcessModules(hProcess, &hMod, sizeof( hMod ), &cbNeeded))
{
DWORD dw = GetModuleFileNameEx(hProcess, hMod, lpFileName, 256);
}
CloseHandle(hProcess);

//比较
if(0 == strcmp(appName, lpFileName))
{
isExist = 1;
break;
}
}
}
}
CloseHandle(hproc);
return isExist;
}
zhucde 2004-03-30
  • 打赏
  • 举报
回复
那就根据它的类名来查找.
类名是固定的.
ra3 2004-03-30
  • 打赏
  • 举报
回复
FindWindow 可以不过
如果窗体的标题是动态的呢?


xuanzg(小钢娃)
1.遍历进程,查找abc.exe 进程id and 句柄
2.通过进程句柄,找到窗口句柄

你说的查找进程应该如何做?
又该如何判断该进程是否存在?
zhang865 2004-03-30
  • 打赏
  • 举报
回复
我来抢分,1年多没来抢分了。

HWND FindWindow(
LPCTSTR lpClassName, // class name
LPCTSTR lpWindowName // window name
);

确实很简单的,也好用.
zhanghk 2004-03-30
  • 打赏
  • 举报
回复
FindWindow
ymbymb 2004-03-30
  • 打赏
  • 举报
回复
FindowWindow 最方便
tabris17 2004-03-30
  • 打赏
  • 举报
回复
有两种方法:
1.用toolhelp32函数枚举系统线程,再用EnumThreadWindows函数枚举线程窗体

2。遍历进程,toolhelp32或PSAPI函数实现。再用EnumWindows或EnumDesktopWindows没举系统窗体,获得窗口句柄,再用GetWindowThreadProcessId函数获得窗口对应的进程ID,和toolhelp32或PSAPI函数得到的进程名比对
zhucde 2004-03-30
  • 打赏
  • 举报
回复
二楼所说的方法操作起来是很烦的,代码也很长.
用一楼的最快捷:
如:
CWnd *pwnd=FindWindow(NULL,"程序标题");
pwnd->m_hWnd即为它的HWND

当然,你也可以用SPY+来得到它的类名,
比如为XXXX,
这样就可以:
CWnd *pwnd=FindWindow("XXXX",NULL);
wshcdr 2004-03-30
  • 打赏
  • 举报
回复
1.遍历进程,查找abc.exe 进程id and 句柄
2.通过进程句柄,找到窗口句柄

=============

想听1。2的详解
mfkzj 2004-03-30
  • 打赏
  • 举报
回复
如果你知道该应用程序窗口的名字可以使用FindWindow(NULL,"应用程序窗口名");查找该应用程序的窗口句柄

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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