首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

小弟我想做个关闭网页的程序。麻烦下

2012-03-01 
我想做个关闭网页的程序。。麻烦高手指点下 - C++ Builder / Windows SDK/APIDWORDFindProcess(char*AppName

我想做个关闭网页的程序。。麻烦高手指点下 - 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,
如果是,则处理之。

下面是我用在《资料收集库》中的一部分代码,你可以参靠一下。

C/C++ code
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") 

热点排行