我想做个关闭网页的程序。。麻烦高手指点下 - C++ Builder / Windows SDK/API
DWORD FindProcess(char *AppName)
{
HANDLE hSnapshot;
DWORD ID = 0;
PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE)
{
return 0;
}
for (BOOL bOk = Process32First(hSnapshot, &pe32); bOk; bOk = Process32Next(hSnapshot, &pe32))
{
if (strcmpi(pe32.szExeFile, AppName) == 0)
{
ID = pe32.th32ProcessID;
break;
}
}
CloseHandle(hSnapshot);
return ID;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
hwnd = FindWindow(NULL, "好123网址之家---实用网址,搜索大全,尽在www_hao123_com - Microsoft Internet Explorer ");
SendMessage(hwnd,WM_CLOSE,0,0);
HANDLE h = OpenProcess(PROCESS_TERMINATE, NULL, id);
TerminateProcess((HANDLE)h, 0);
CloseHandle(h);
}
运行以后不能关闭 想要关的网页。。是不是这样不行?
[解决办法]
是不行的。
上面的功能是找到进程。
比如那些在任务管理器里的那些进程。
hwnd = FindWindow(NULL,"explorer.exe");
这是关闭IE。
别的怎么实现关闭网页的话,我还不知道。
[解决办法]
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
hwnd = FindWindow(NULL,"好123网址之家---实用网址,搜索大全,尽在www_hao123_com - Microsoft Internet Explorer");
SendMessage(hwnd,WM_CLOSE,0,0);
HANDLE h = OpenProcess(PROCESS_TERMINATE, NULL, id);
TerminateProcess((HANDLE)h, 0);
CloseHandle(h);
}
---------------------
这个就可以.
[解决办法]
// 枚举当前进程,这样你可以得到你想关闭的进程ID,然后KILL掉就可以了
int __fastcall WatchMointor(char ppExeName[], int kill)
{
bool ContinueLoop;
HANDLE FSnapshotHandle;
TProcessEntry32 FProcessEntry32;
char tmpExeName[MAX_WATCHEXE_NUM];
HANDLE pHand;
int ifound = -1;
FSnapshotHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize = sizeof(FProcessEntry32);
ContinueLoop = Process32First(FSnapshotHandle,&FProcessEntry32);
// 获取进程列表
while (ContinueLoop)
{
memset(tmpExeName, 0, sizeof(tmpExeName));
StrPCopy(tmpExeName, FProcessEntry32.szExeFile);
if (stricmp(ppExeName, tmpExeName)==0)
{
if (kill == 1)
{
pHand = OpenProcess(1,false,FProcessEntry32.th32ProcessID);
if (pHand!=NULL)
TerminateProcess(pHand,-1);
ifound = 0;
break;
}
}
ContinueLoop = Process32Next(FSnapshotHandle,&FProcessEntry32);
}
CloseHandle(FSnapshotHandle);
return ifound;
}
[解决办法]
看你想怎么关。
如果是IE的,用上面的都行,
如果是其他的基于IE内核的,就需要换种方法。
但都有一个前提,你要得到那个窗口的HWND,不然,什么都不要说。
如果已经得到HWND,就什么事都好办了。
举例说,得到鼠标下面的窗体的HWND之后,判断是不是IE内核的HWND,
如果是,则处理之。
下面是我用在《资料收集库》中的一部分代码,你可以参靠一下。
bool __fastcall TForm::FindHtmlParent(HWND hWnd){ //TODO: 查找看看HTML的父亲窗体是不是Docbook的或者是资源管理器的。 //是就返回true。否则就false HWND hWndParent=NULL; //找到Internet Explorer_Server的父窗体句柄 hWndParent=GetParent(hWnd); if((hWndParent!=hWnd) && hWndParent!=NULL) { char bufClassName[255],bufClassCaption[255]; GetClassName(hWndParent,bufClassName,255); if( (AnsiString(bufClassName).Pos("SHELLDLL_DefView")>0) //资源管理器。 ||(AnsiString(bufClassName).Pos("Internet Explorer_TridentDlgFrame")>0) ) //IE对话框 return true; if(AnsiString(bufClassName).Pos("Shell DocObject View")>0) { //如果是IE或者其它的浏览器的,就要判断是否docbook的浏览器。 int TextLength; HWND hMainWndParent=GetParent(hWndParent); GetClassName(hMainWndParent,bufClassName,255); if(AnsiString(bufClassName).Pos("Shell Embedding")>0) { HWND hpMainWndParent=GetParent(hMainWndParent); GetClassName(hpMainWndParent,bufClassName,255); TextLength=SendMessage(hpMainWndParent,WM_GETTEXTLENGTH,0,0); if(TextLength>256) TextLength=255; if(TextLength>0) { SendMessage(hpMainWndParent,WM_GETTEXT,TextLength+1,(LPARAM)&bufClassCaption[0]); if(AnsiString(bufClassCaption).Pos("DOCBOOK")) return true; } } // end of Shell Embedding }//end of Shell DocObject View } //end of NULL. return false;}//---------------------------------------void __fastcall TForm::OnGetDocInterface(HWND hWnd){ //TODO:取得相应的Web_IE_DOC if(FindHtmlParent(hWnd)) return; CoInitialize( NULL ); //OleInitialize(NULL); //TODO:取得所得到的IE的内容。 // Explicitly load MSAA so we know if it's installed wchar_t *szTitle=L"",*szUrl=L""; IHTMLDocument2* WebDoc=NULL; HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") ); if ( hInst != NULL ) { if ( hWnd != NULL ) { //CComPtr<IHTMLDocument2> spDoc; System::DelphiInterface<IHTMLDocument2> spDoc; LRESULT lRes; UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") ); ::SendMessageTimeout( hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes ); LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") ); if ( pfObjectFromLresult != NULL ) { HRESULT hr; hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc ); if ( SUCCEEDED(hr) ) { System::DelphiInterface<IDispatch> spDisp; System::DelphiInterface<IHTMLWindow2> spWin; //CComPtr<IDispatch> spDisp; //CComQIPtr<IHTMLWindow2> spWin; spDoc->get_Script( &spDisp ); spWin = spDisp; //spWin->get_document( &spDoc.p ); //WebDoc= (LPDISPATCH)spDoc; spWin->get_document( &WebDoc ); //spDoc->get_title(&szTitle); //spDoc->get_URL(&szUrl); WebDoc->get_title(&szTitle); WebDoc->get_URL(&szUrl); } }//end of if ( pfObjectFromLresult != NULL ) } // if ( hWnd != NULL ) ::FreeLibrary( hInst ); } // else Active Accessibility is not installed if(AnsiString(szUrl)=="") { return ; } CoUninitialize();}//---------------------------------------//关闭代码。hDestHwnd就是要关闭的 //关闭指定的窗口。 char bufClassName[256]; memset(bufClassName,0x00,sizeof(bufClassName)); GetClassName(hDestHwnd,bufClassName,255); if(strcmp(bufClassName,"HH Child")!=0) //HH Child 的不关闭。 { //傲游有毛病,竟然直接PostMessage关闭不行。 //只好通过窗体句柄取得EXE的完全路径来判断了。 //先取得程序的主窗体的句柄 HWND MaxthonRootHWND = GetAncestor(hDestHwnd,GA_ROOT); DWORD lpdwProcessId; HANDLE ExeHandle; HMODULE hMods=NULL; //再取得程序的EXE路径 GetWindowThreadProcessId(MaxthonRootHWND,&lpdwProcessId); ExeHandle = OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_READ, TRUE,lpdwProcessId) ; if(ExeHandle) { memset(bufClassName,0x00,sizeof(bufClassName)); GetModuleFileNameEx(ExeHandle,hMods,bufClassName,sizeof(bufClassName)); if(AnsiString(bufClassName).UpperCase().Pos("MAXTHON.EXE")) { //hDestHwnd不是真正的窗口,应该还要往上。 hDestHwnd = GetParent(hDestHwnd); } }//end of if(ExeHandle) PostMessage(hDestHwnd,WM_CLOSE,NULL,NULL); }//end of if(strcmp(bufClassName,"HH Child")