如何根据hWnd获得应用程序的全路径?

creakmud 2004-08-17 09:11:21
我使用以下方法,但是只能获得当前程序的全路径,而不是hWnd的路径。我错在哪里呢?

hInst = (HINSTANCE) GetWindowLong(hWnd,GWL_HINSTANCE);
GetModuleFileNameEx(NULL,hInst,szFileName,MAX_PATH);
...全文
414 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
问道er 2004-08-17
  • 打赏
  • 举报
回复
CString GetName(HWND hWnd){
HMODULE Instance;
Instance=(HMODULE)::GetWindowLong(hWnd,GWL_HINSTANCE);
int RtnLength;
char Buffer[256];
unsigned long size=256;
RtnLength=GetModuleFileName(Instance,Buffer,size);
return buffer;
}
broown 2004-08-17
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3216/3216687.xml?temp=.1428339
nlstone 2004-08-17
  • 打赏
  • 举报
回复
2000和98对内核对象的管理不一样,跨进程可能要稍微走一点曲线救国的道路...
up,关注...
celerityok 2004-08-17
  • 打赏
  • 举报
回复
搜索一下不行吗?
creakmud 2004-08-17
  • 打赏
  • 举报
回复
怎么都答非所问啊!
hWnd是进程的HWND,我想通过HWND获得,执行文件的全路径.
假设我已经用FindWindow的方法获得了某个应用程序运行时的HWND,然后使用
GetWindowLong(hWnd,GWL_HINSTANCE);获得HINSTANCE,最后调用GetModuleFileName(hInst,szFileName,MAX_PATH);获得路径。这个方法在MSDN中有说过,我在Win98上使用正常,但是在Win2000下运行时,不管hWnd是什么,GetModuleFileName(hInst,szFileName,MAX_PATH);都只能得到当前应用程序的路径。

郁闷ing........
creakmud 2004-08-17
  • 打赏
  • 举报
回复
看不出 chemo(林小枫) 的关键代码在哪里。最后还是用了 GetModuleFileName
GetModuleFileName在win2000是无法获得其他进程的执行文件的路径的。看来只能用别的办法了~~哎
esko 2004-08-17
  • 打赏
  • 举报
回复
GetCurrentDirectory
zjg751206 2004-08-17
  • 打赏
  • 举报
回复
先查找exe文件。然后找路径。findwindow函数。
getmodulefilename什么的。你看一下
flyelf 2004-08-17
  • 打赏
  • 举报
回复
hwnd好像没有什么全路径吧
SeaBirds 2004-08-17
  • 打赏
  • 举报
回复
hWnd不就是程序开出窗口的柄呀,你还要什么路径??
snaill 2004-08-17
  • 打赏
  • 举报
回复
hWnd的路径?是什么?
chemo 2004-08-17
  • 打赏
  • 举报
回复
要枚举进程模块
//得到输入焦点窗口进程句柄.
hWnd = GetFocus();
tId = GetWindowThreadProcessId(hWnd, &pId);
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);

//枚举进程内模块.
if(!EnumProcessModules(hProcess, eModule, sizeof(eModule), &rSize))
{
//获取出错信息.
TCHAR ErrorMsg[256];
DWORD ErrorCode;
ErrorCode = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, 0, ErrorMsg, 256, NULL);
MessageBox(NULL, ErrorMsg, _T("枚举进程模块失败!!"), MB_OK);
}
CloseHandle(hProcess);

//得到当前拥用输入焦点模块名.
if(!GetModuleFileName(eModule[0], ModuleName, sizeof(ModuleName) / sizeof(TCHAR)))
{
//获取出错信息.
TCHAR ErrorMsg[256];
DWORD ErrorCode;
ErrorCode = GetLastError();
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, 0, ErrorMsg, 256, NULL);
MessageBox(NULL, ErrorMsg, _T("获得模块名失败!!"), MB_OK);
}
creakmud 2004-08-17
  • 打赏
  • 举报
回复
to smile_cc(笑笑) ,tenfeichris(颗粒) :
你们的操作系统是什么?还是你们不明白我的问题??


hInst = (HINSTANCE) GetWindowLong(hWnd,GWL_HINSTANCE);
GetModuleFileName(hInst,szFileName,MAX_PATH);

上面代码在Win2000下运行,结果只能得到当前程序的路径。而我想要的结果是hWnd的应用程序的路径。

漂行者 2004-08-17
  • 打赏
  • 举报
回复
如果用GetModuleFileName()也不需要用hWnd的阿!
代码如下:
char exeFullPath[MAX_PATH];
GetModuleFileName(NULL,exeFullPath,MAX_PATH);
这样就可以了阿
功能描述 clsWindow是VB6环境下使用的一个操作外部程序窗口的类,比如得到窗口句柄,得到窗口里某个文本框的内容。非常方便,使用它可以让您脱身于一堆api函数,功能强大使用简单! 这个类楼主很早就开始封装了,原本打算做成类似DOM对象那样,通过一堆getElmentByXXX等方法实现对桌面程序下各个窗口以及里面各个控件对象的自由访问,但是具体要做的工作太多,目前只实现了一部分,期待大家一起加入更新维护。 目前该类封装了绝大部分对windows窗口的常用操作,例如:获取窗口句柄,设置窗口为活动窗口,设置窗口内文本框内容,点击窗口内的某些按钮等。 这个类现在还在一直不断地扩充,功能已经很强大很广泛,使用它可以轻而易举地设置窗口标题栏文字,移动窗体等等。以前要实现这些操作常常需要一大堆api函数,现在只需要一点点代码就可以了,完让您脱身于api函数的海洋。当然您需要研究每个方法实现原理的话可以看一看源代码。 使用范例(请在v1.9以上测试): 1)关闭腾讯新闻窗口“腾讯网迷你版”。 Dim window As New clsWindow If window.GetWindowByTitle("腾讯网迷你版").hWnd > 0 Then window.CloseWindow '关闭窗口 End If 以上是不是很简洁呢? 20150715更新追加: 最新1.9版本更简洁,一句话解决: w.GetWindowByTitle("腾讯网迷你版").CloseWindow 小伙伴,是不是简洁爆了呢?:) 为了防止程序找不到窗口而一直等待可以改成: w.GetWindowByTitle("腾讯网迷你版",1).CloseWindow (意思为超时等待1秒。默认会耐心等60秒,除非你确定窗口一定有,然后就用上面的。) 2)获取某个打开的记事本里面的内容。假设记事本标题为“测试要求.txt - 记事本”,通过SPY等工具查看得知记事本的文本框类名为:Edit,那么我们编写程序如下: Dim window As New clsWindow If window.GetWindowByTitle("测试要求.txt - 记事本").hWnd > 0 Then MsgBox window.GetElementTextByClassName("Edit") End If 这个看起来也很简单,方法自由还可以使用正则匹配,可以写成下面这样: Dim window As New clsWindow If window.GetWindowByTitleEx("工作任务\.txt.*?", , , True).hWnd > 0 Then MsgBox window.GetElementTextByClassName("Edi", , True) '第三个参数表示是否使用正则,默认为false End If 获取标题那边如果觉得要把标题写完整太麻烦,可以将GetWindowByTitle该车GetWindowByTitleEx然后后面只要写关键字就行啦。看招: Dim window As New clsWindow If window.GetWindowByTitleEx("工作任务").hWnd > 0 Then MsgBox window.GetElementTextByClassName("Edit") End If clsWindow类最新版下载请关注博客: http://blog.csdn.net/sysdzw/article/details/9083313 '============================================================================================== '名 称:windows窗体控制类v2.0 '描 述:一个操作windows窗口的类,可对窗口进行很多常用的操作(类名为clsWindow) '使用范例:Dim window As New clsWindow ' window.GetWindowByTitle "计算器" ' window.closeWindow '编 程:sysdzw 原创开发,如果有需要对模块扩充或更新的话请邮箱发我一份,共同维护 '发布日期:2013/06/01 '博 客:http://blog.163.com/sysdzw ' http://blog.csdn.net/sysdzw 'Email :sysdzw@163.com 'QQ :171977759 '版

16,471

社区成员

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

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

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