VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2248|回复: 4

我想做个关闭网页的程序。。麻烦高手指点下

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-4-25 15:30:02 | 显示全部楼层 |阅读模式
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);

}


运行以后不能关闭 想要关的网页。。是不是这样不行?
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-4-25 17:45:01 | 显示全部楼层
是不行的。
上面的功能是找到进程。
比如那些在任务管理器里的那些进程。
hwnd   =   FindWindow(NULL,"explorer.exe");
这是关闭IE。
别的怎么实现关闭网页的话,我还不知道。
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2021-4-25 18:00:01 | 显示全部楼层
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);

}
---------------------
这个就可以.
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-4-25 18:15:01 | 显示全部楼层
// 枚举当前进程,这样你可以得到你想关闭的进程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;
}
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2021-4-25 18:30:01 | 显示全部楼层
看你想怎么关。
如果是IE的,用上面的都行,
如果是其他的基于IE内核的,就需要换种方法。
但都有一个前提,你要得到那个窗口的HWND,不然,什么都不要说。
如果已经得到HWND,就什么事都好办了。
举例说,得到鼠标下面的窗体的HWND之后,判断是不是IE内核的HWND,
如果是,则处理之。

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

[code=C/C++]

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")
[/code]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表