Win9x 下怎樣得枚舉到的HWND對應的語文件名?(UP=2分) hInstance=GetClassLong(hWnd,GCL_INSTANCE)//获得实例子句柄GetModuleFileName(hInstance,szFileName,100);//获得文件名 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 抱歉,第一句应该是:GetWindowLong(hWnd,GWL_HINSTANCE); To enmai:這樣取得的只時當前自已運行程序的名稱.我是想知道其它運行的程序的名稱? CWnd *cWnd = FromHandle(hwnd);cWnd->GetWindowText(); 用EnumWindowsProc遍历当前所有的窗口就可以啦然后用下面的方法:hInstance=GetClassLong(hWnd,GCL_INSTANCE)//获得实例子句柄GetModuleFileName(hInstance,szFileName,100);//获得文件名 我想要的結果不是標題名,而是文件名.即是當前hwnd是什麼*.exe或*.dll文件或其它文件.Win9x下不支持PSAPI.DLL的調用,因而無法使用EnumProcessModules和GetModuleFileNameEx函數. 调用 GetWindowModuleFileName 函数可以。不过在我这里总是出错,你先试一试好了。 放分了.謝謝各位的參與.GetWindowModuleFileName()對用C編寫的程序可以給出文件名,對VB寫的只是給出VB帶的動態鏈接庫...我的源代碼如下,可以正常運行:#include "SpyProcDlg.h"#include <Winable.h>struct LPar{ HTREEITEM hidx; CTreeCtrl *tree; CListCtrl *list;};BOOL CALLBACK EnumWinProc(HWND, LPARAM);BOOL CALLBACK EnumChildTree(HWND, LPARAM);void CSpyProcDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSpyProcDlg) DDX_Control(pDX, IDC_LIST_PROC, lview); DDX_Control(pDX, IDC_TREE_PROC, tview); //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CSpyProcDlg, CDialog) //{{AFX_MSG_MAP(CSpyProcDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_BTN_REFRESH, OnBtnRefresh) ON_BN_CLICKED(IDC_BTN_KILLPROC, OnBtnKillproc) ON_BN_CLICKED(IDC_BTN_DELITEM, OnBtnDelitem) ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit) ON_BN_CLICKED(IDC_BTN_FILENAME, OnBtnFilename) ON_BN_CLICKED(IDC_BTN_TERMINATION, OnBtnTermination) ON_BN_CLICKED(IDC_OPT_TREEVIEW, OnOptTreeview) ON_BN_CLICKED(IDC_OPT_LISTVIEW, OnOptListview) //}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CSpyProcDlg::OnInitDialog(){ CDialog::OnInitDialog(); // TODO: Add extra initialization here lview.ShowWindow (FALSE); lview.SetExtendedStyle (LVS_EX_FULLROWSELECT); lview.InsertColumn(0,"HWND",LVCFMT_LEFT,100); lview.InsertColumn(1,"CLASS",LVCFMT_LEFT,160); lview.InsertColumn(2,"TITLE & TEXT",LVCFMT_LEFT,200); LPar pt; pt.tree =(CTreeCtrl *)GetDlgItem(IDC_TREE_PROC); pt.list = (CListCtrl *)GetDlgItem(IDC_LIST_PROC); EnumWindows((WNDENUMPROC)EnumWinProc,(LPARAM)&pt); return TRUE; // return TRUE unless you set the focus to a control}BOOL CALLBACK EnumChildTree(HWND hwnd, LPARAM lParam){ if(hwnd) { char szClass[150]; GetClassName(hwnd,szClass,sizeof(szClass)); char szText[100]; GetWindowText (hwnd,szText,sizeof(szText)); if(strlen(szText)){ strcat(szClass," - "); strcat(szClass,szText); }else{ ::SendMessage(hwnd,WM_GETTEXT,100,(long)szText); if (strlen(szText)) { strcat(szClass," - "); strcat(szClass,szText); } } LPar *temp; temp=(LPar *)lParam; CTreeCtrl *tree=(CTreeCtrl *)(temp->tree); HTREEITEM hidx; hidx=tree->InsertItem (szClass,1,1,(temp->hidx)); } return TRUE;}BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam){ CString str; LPar *temp; static int i=0; temp=(LPar *)lParam; CTreeCtrl *tree=(CTreeCtrl *)(temp->tree); CListCtrl *list=(CListCtrl *)(temp->list); str.Format ("0x%8.8X",hwnd); list->InsertItem(i,str); GetClassName (hwnd,(LPSTR)(LPCTSTR)str,100); list->SetItemText (i,1,str); GetWindowText (hwnd,(LPSTR)(LPCTSTR)str,100); if (strlen(str)==0){ char szText[100]; ::SendMessage(hwnd,WM_GETTEXT,100,(long)szText); str=szText; } list->SetItemText(i,2,str); //if (strlen(str)==0)GetClassName (hwnd,(LPSTR)(LPCTSTR)str,100); if (strlen(str)){ HTREEITEM hidx; hidx=tree->InsertItem(str,0,0); temp->hidx =hidx; EnumChildWindows(hwnd,EnumChildTree,(LPARAM)temp); } i++; return TRUE;}void CSpyProcDlg::OnBtnRefresh() { // TODO: Add your control notification handler code here tview.DeleteAllItems(); lview.DeleteAllItems(); LPar pt; pt.tree =(CTreeCtrl *)GetDlgItem(IDC_TREE_PROC); pt.list=(CListCtrl *)GetDlgItem (IDC_LIST_PROC); EnumWindows((WNDENUMPROC)EnumWinProc,(LPARAM)&pt);}void CSpyProcDlg::OnBtnKillproc() { // TODO: Add your control notification handler code here HTREEITEM hIdx=tview.GetSelectedItem(); CString str=tview.GetItemText (hIdx); HWND hwnd=::FindWindow(NULL,str); if (hwnd ==NULL) hwnd=::FindWindow(str,NULL); if (hwnd==NULL){ AfxMessageBox ("None Find hwnd"); return; } ::PostMessage(hwnd,WM_CLOSE,0,0); Sleep(100); if (!(::FindWindow (NULL,str))) { if(hIdx)tview.DeleteItem (hIdx); }}void CSpyProcDlg::OnBtnDelitem() { // TODO: Add your control notification handler code here HTREEITEM hItem=tview.GetSelectedItem(); if(hItem)tview.DeleteItem (hItem);}void CSpyProcDlg::OnBtnExit() { // TODO: Add your control notification handler code here //::PostMessage(hwnd,WM_CLOSE,0,0); CDialog::EndDialog(0);}void CSpyProcDlg::OnBtnFilename() { // TODO: Add your control notification handler code here HTREEITEM hIdx=tview.GetSelectedItem(); CString str=tview.GetItemText (hIdx); HWND hwnd=::FindWindow(NULL,str); if (hwnd==NULL) hwnd=::FindWindow (str,NULL); if (hwnd==NULL) return; char szFile[100]; GetWindowModuleFileName(hwnd,szFile,sizeof(szFile)); AfxMessageBox (szFile);}void CSpyProcDlg::OnBtnTermination() { // TODO: Add your control notification handler code here DWORD dwProcessId; HTREEITEM hIdx=tview.GetSelectedItem(); CString str=tview.GetItemText (hIdx); HWND hwnd=::FindWindow(NULL,str); if (hwnd==NULL) hwnd=::FindWindow (str,NULL); //得到該視窗的進程ID GetWindowThreadProcessId(hwnd,&dwProcessId); //從進程ID打開進程句柄 HANDLE handle=OpenProcess(0,FALSE,dwProcessId); TerminateProcess(handle,0); Sleep(200); if (!(::FindWindow (NULL,str))) { if(hIdx)tview.DeleteItem (hIdx); }} 本程序的功能是發現Win9x下運行了哪些進程,可以知道是什麼文件名 並可詢問或中止強制中止它運行.使系統有更多的可用內存. 关于属性页的问题 请问有关于LVITEM的问题 有关unicode的问题 菜鸟最后的分求问: 怎样获得数据库的表名,表里字段名和类型(20分加万分感谢) VC7使用属性化编程和非属性化编程时SAFEARRAY使用方式不同吗? 知道进程ID,怎样通过这个ID获的该进程的窗口 聪明的大哥帮忙 大出血做广告,请大家来指点指点我写的3d推箱子 如何获取当前网页子框架的URL并将页面上的内容下载至TXT 图片居中显示 一个CComboBox的问题? 用ADSL上网,WINGATE作代理,局哉网的机子都不能用OICQ 也不能用FOXMAIL
GetWindowLong(hWnd,GWL_HINSTANCE);
cWnd->GetWindowText();
然后用下面的方法:
hInstance=GetClassLong(hWnd,GCL_INSTANCE)//获得实例子句柄
GetModuleFileName(hInstance,szFileName,100);//获得文件名
Win9x下不支持PSAPI.DLL的調用,因而無法使用EnumProcessModules和GetModuleFileNameEx函數.
GetWindowModuleFileName()對用C編寫的程序可以給出文件名,對VB寫的只是給出VB帶的動態鏈接庫...
我的源代碼如下,可以正常運行:
#include "SpyProcDlg.h"
#include <Winable.h>
struct LPar
{
HTREEITEM hidx;
CTreeCtrl *tree;
CListCtrl *list;
};BOOL CALLBACK EnumWinProc(HWND, LPARAM);
BOOL CALLBACK EnumChildTree(HWND, LPARAM);
void CSpyProcDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSpyProcDlg)
DDX_Control(pDX, IDC_LIST_PROC, lview);
DDX_Control(pDX, IDC_TREE_PROC, tview);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSpyProcDlg, CDialog)
//{{AFX_MSG_MAP(CSpyProcDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_REFRESH, OnBtnRefresh)
ON_BN_CLICKED(IDC_BTN_KILLPROC, OnBtnKillproc)
ON_BN_CLICKED(IDC_BTN_DELITEM, OnBtnDelitem)
ON_BN_CLICKED(IDC_BTN_EXIT, OnBtnExit)
ON_BN_CLICKED(IDC_BTN_FILENAME, OnBtnFilename)
ON_BN_CLICKED(IDC_BTN_TERMINATION, OnBtnTermination)
ON_BN_CLICKED(IDC_OPT_TREEVIEW, OnOptTreeview)
ON_BN_CLICKED(IDC_OPT_LISTVIEW, OnOptListview)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()BOOL CSpyProcDlg::OnInitDialog()
{
CDialog::OnInitDialog(); // TODO: Add extra initialization here
lview.ShowWindow (FALSE);
lview.SetExtendedStyle (LVS_EX_FULLROWSELECT);
lview.InsertColumn(0,"HWND",LVCFMT_LEFT,100);
lview.InsertColumn(1,"CLASS",LVCFMT_LEFT,160);
lview.InsertColumn(2,"TITLE & TEXT",LVCFMT_LEFT,200); LPar pt;
pt.tree =(CTreeCtrl *)GetDlgItem(IDC_TREE_PROC);
pt.list = (CListCtrl *)GetDlgItem(IDC_LIST_PROC);
EnumWindows((WNDENUMPROC)EnumWinProc,(LPARAM)&pt); return TRUE; // return TRUE unless you set the focus to a control
}BOOL CALLBACK EnumChildTree(HWND hwnd, LPARAM lParam)
{
if(hwnd)
{
char szClass[150];
GetClassName(hwnd,szClass,sizeof(szClass));
char szText[100];
GetWindowText (hwnd,szText,sizeof(szText));
if(strlen(szText)){
strcat(szClass," - ");
strcat(szClass,szText);
}else{
::SendMessage(hwnd,WM_GETTEXT,100,(long)szText);
if (strlen(szText)) {
strcat(szClass," - ");
strcat(szClass,szText);
}
}
LPar *temp;
temp=(LPar *)lParam;
CTreeCtrl *tree=(CTreeCtrl *)(temp->tree);
HTREEITEM hidx;
hidx=tree->InsertItem (szClass,1,1,(temp->hidx));
}
return TRUE;
}BOOL CALLBACK EnumWinProc(HWND hwnd, LPARAM lParam)
{
CString str;
LPar *temp;
static int i=0; temp=(LPar *)lParam;
CTreeCtrl *tree=(CTreeCtrl *)(temp->tree);
CListCtrl *list=(CListCtrl *)(temp->list); str.Format ("0x%8.8X",hwnd);
list->InsertItem(i,str);
GetClassName (hwnd,(LPSTR)(LPCTSTR)str,100);
list->SetItemText (i,1,str);
GetWindowText (hwnd,(LPSTR)(LPCTSTR)str,100);
if (strlen(str)==0){
char szText[100];
::SendMessage(hwnd,WM_GETTEXT,100,(long)szText);
str=szText;
}
list->SetItemText(i,2,str);
//if (strlen(str)==0)GetClassName (hwnd,(LPSTR)(LPCTSTR)str,100);
if (strlen(str)){
HTREEITEM hidx;
hidx=tree->InsertItem(str,0,0);
temp->hidx =hidx;
EnumChildWindows(hwnd,EnumChildTree,(LPARAM)temp);
}
i++;
return TRUE;
}
void CSpyProcDlg::OnBtnRefresh()
{
// TODO: Add your control notification handler code here
tview.DeleteAllItems();
lview.DeleteAllItems();
LPar pt;
pt.tree =(CTreeCtrl *)GetDlgItem(IDC_TREE_PROC);
pt.list=(CListCtrl *)GetDlgItem (IDC_LIST_PROC);
EnumWindows((WNDENUMPROC)EnumWinProc,(LPARAM)&pt);
}void CSpyProcDlg::OnBtnKillproc()
{
// TODO: Add your control notification handler code here
HTREEITEM hIdx=tview.GetSelectedItem();
CString str=tview.GetItemText (hIdx);
HWND hwnd=::FindWindow(NULL,str);
if (hwnd ==NULL) hwnd=::FindWindow(str,NULL);
if (hwnd==NULL){
AfxMessageBox ("None Find hwnd");
return;
}
::PostMessage(hwnd,WM_CLOSE,0,0);
Sleep(100);
if (!(::FindWindow (NULL,str)))
{
if(hIdx)tview.DeleteItem (hIdx);
}
}void CSpyProcDlg::OnBtnDelitem()
{
// TODO: Add your control notification handler code here
HTREEITEM hItem=tview.GetSelectedItem();
if(hItem)tview.DeleteItem (hItem);}void CSpyProcDlg::OnBtnExit()
{
// TODO: Add your control notification handler code here
//::PostMessage(hwnd,WM_CLOSE,0,0);
CDialog::EndDialog(0);
}void CSpyProcDlg::OnBtnFilename()
{
// TODO: Add your control notification handler code here
HTREEITEM hIdx=tview.GetSelectedItem();
CString str=tview.GetItemText (hIdx);
HWND hwnd=::FindWindow(NULL,str);
if (hwnd==NULL) hwnd=::FindWindow (str,NULL);
if (hwnd==NULL) return;
char szFile[100];
GetWindowModuleFileName(hwnd,szFile,sizeof(szFile));
AfxMessageBox (szFile);
}void CSpyProcDlg::OnBtnTermination()
{
// TODO: Add your control notification handler code here
DWORD dwProcessId;
HTREEITEM hIdx=tview.GetSelectedItem();
CString str=tview.GetItemText (hIdx);
HWND hwnd=::FindWindow(NULL,str);
if (hwnd==NULL) hwnd=::FindWindow (str,NULL);
//得到該視窗的進程ID
GetWindowThreadProcessId(hwnd,&dwProcessId);
//從進程ID打開進程句柄
HANDLE handle=OpenProcess(0,FALSE,dwProcessId);
TerminateProcess(handle,0);
Sleep(200);
if (!(::FindWindow (NULL,str)))
{
if(hIdx)tview.DeleteItem (hIdx);
}}
並可詢問或中止強制中止它運行.使系統有更多的可用內存.