如何利用GetModuleFileName得到另外一个应用程序的执行文件名?

quarkfc 2001-04-01 04:19:00
代码如下:
HWND hWnd=GetForegroundWindow();
HMOUDLE hModule=GetClassLong(hWnd,GCL_MODULE);
//或HMOUDLE hModule=GetWindowLong(hWnd,GWL_MODULE);
GetModuleFileName(hModule,FileName,size);

当我的程序在后面运行时候。得到前面的窗口句柄,但无法得到前面窗口对应
的执行程序文件名。
当自己应用程序在前面时候,才有了正确FIleName,.但我现在想得到另外一个
应用程序的文件名,请问上述代码问题出现在那里?
...全文
169 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
monkey_boy 2001-11-13
  • 打赏
  • 举报
回复
char WinExe[256];//执行文件自己的路径
char *pbuf;
pbuf = GetCommandLine();

strcpy(WinExe, pbuf + 1);
WinExe即你所求
Frank_Xu 2001-11-13
  • 打赏
  • 举报
回复
我已試過了
在Win9x下見http://www.csdn.net/expert/topic/357/357311.shtm
在NT或2000以上,要用到 PSAPI.DLL中的EnumProcessModules和GetModuleFileNameEx函數.
Frank_Xu 2001-11-06
  • 打赏
  • 举报
回复
關注
sxbyl 2001-04-01
  • 打赏
  • 举报
回复
这是从我的工程中拷出来的代码,自己先看一下,有问题再说了
bool CWatcherDlg::DetectState(bool bCheck)
{
int nCount,i;
char szName[256];
tagProgramInfo *pInfo=NULL;
CTimeSpan spanOneHour(0,1,0,0);
DWORD pProcessID[1024];
DWORD dwSize;
HANDLE hProcess;
HMODULE hModule;
CString strMsg;
nCount=m_aryProgramInfo.GetSize();
HWND hWnd=::FindWindow(NULL,"Microsoft Visual C++ Runtime Library");
if(hWnd!=NULL)
::PostMessage(hWnd,WM_KEYDOWN,13,0x011c0001); //模拟按下Enter健
/*清除链表中各进程状态*/
for(i=0;i<nCount;i++)
{
pInfo=(tagProgramInfo *)m_aryProgramInfo.GetAt(i);
if(bCheck==true)
{
if(m_ctrlProgram.GetCheck(i)==FALSE)
pInfo->nState=STA_PAUSE | STA_ERROR;
else
pInfo->nState=STA_ERROR;
}
}
/*枚举所有进程*/
EnumProcesses(pProcessID,sizeof(pProcessID),&dwSize);
nCount=dwSize/sizeof(DWORD);
/*枚举所有窗口*/
EnumWindows(EnumWndProc,(LPARAM)this);
for(i=0;i<nCount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ |PROCESS_TERMINATE,FALSE,pProcessID[i]);
if(hProcess)
{
if(EnumProcessModules(hProcess,&hModule,sizeof(hModule),&dwSize))
{
GetModuleFileNameEx(hProcess,hModule,szName,sizeof(szName));
TRACE1("程序名:%s\r\n",szName);
pInfo=GetInfoFromName(szName); //枚举到的程序是否在链表中
if(pInfo==NULL)
{
CloseHandle(hProcess);
continue;
}
pInfo->nState&=STA_PAUSE; //清除nState中的低位
pInfo->nState|=STA_NORMAL; //设置低位为Normal
pInfo->hProcess=hProcess;
}
}
}
EnumWindows(EnumWndProc,(LPARAM)this);
nCount=m_aryProgramInfo.GetSize();
for(i=0;i<nCount;i++)
{
pInfo=(tagProgramInfo *)m_aryProgramInfo.GetAt(i);
if(pInfo->nState & STA_PAUSE)
continue;
if(pInfo->hProcess==NULL)
{
StartProgram(pInfo);
continue;
}
if(pInfo->nState==STA_ERROR || pInfo->nState==STA_NULL)
{
UpdateTrayNotifyWnd();
pInfo->hProcess=NULL;
StartProgram(pInfo);
}
}
return true;
}

16,551

社区成员

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

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

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