ブラウザを開く&閉じる

[戻る]
ゆき 2004/09/01(水) 16:49:47
お世話になります。
Win2000/MFCのアプリから,
1.ブラウザを起動し,特定のローカルHTMLを開く
2.開いたブラウザを閉じる
ということを実現したいと考えています。

開くことに関しては、
ShellExecute(NULL, "open", "C:\\test.html", NULL, NULL, SW_SHOWNORMAL);
で簡単に作成できるのは分かっているんですが、
この開いたブラウザを閉じるにはどうすれば良いものなのでしょうか?

どなたかご教授願います。

シャノン 2004/09/01(水) 23:08:10
ShellExecute ではなく ShellExecuteEx を使いましょう。
SHELLEXECUTEINFO 構造体の fMask メンバに SEE_MASK_NOCLOSEPROCESS を指定して
hProcess メンバに返されるプロセスハンドルの終了を待ちます。

このへん参考に。
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&q=%E3%83%97%
E3%83%AD%E3%82%BB%E3%82%B9+%E7%B5%82%E4%BA%86+%E5%BE%85%E6%A9%9F

シャノン 2004/09/01(水) 23:08:58
ごめんなさい間違えました…
終了待機じゃないや、終了させたいんですね。
↑のレスは見なかったことにしてください。

シャノン 2004/09/01(水) 23:21:42
1.
↑と同じ方法でプロセスハンドルを取得し、TerminateProcess する。
簡単ですが危険な方法なので、あまりおすすめしません。

2.
ShellExecute ではなく CreateProcess を使う。
ShellExecuteEx ではプロセスハンドルしか得られませんが、CreateProcess なら
プロセス ID が得られます。
ここからメインウィンドウを取得して、WM_CLOSE を投げて終了させてやります。
面倒くさいですが、安全に終了できます。

CreateProcess では *.html などの実行可能でないファイル名を指定できませんので
FindExecutable を使用して、ブラウザのパスを取得しておきます。

プロセス ID からウィンドウハンドルを得るには

2-a.
EnumWindows や FindWindow でウィンドウを取得し、それぞれに対して 
GetWindowThreadProcessId を使ってプロセス ID を取得、CreateProcess の結果と
比較する

2-b.
CreateToolhelp32Snapshot / Thread32First / Thread32Next で、CreateProcess で
作成したプロセスに属するスレッドを列挙し、それぞれに対して
EnumThreadWindows でウィンドウハンドルを列挙する。

など。
どちらの場合も、さらに GetClassName などを使って絞り込むべきだと思います。

ところで、Internet Explorer は複数のウィンドウを一つのプロセスで開くことが
できますし、タイトルバーの「Microsoft Internet Explorer」という文字列も
レジストリをいじることで自在に変えることが出来ます。

…IE のウィンドウハンドルを取得するのはかなり難しいかもしんない。

ぽこ 2004/09/01(水) 23:59:15
ブラウザがIEであれば、COMを利用する手もあります。

#include "stdafx.h"
#include <windows.h>
#include <comutil.h>
#include <comdef.h>
#include <Exdisp.h>

int StartIE(LPCTSTR lpszUrl);


int main(void)
{
    StartIE("www.yahoo.co.jp");
    return 0;
}


int StartIE(LPCTSTR lpszUrl)
{
    CLSID clsid;
    IUnknown     *pUnknown = NULL;
    IWebBrowser2 *pBrowser = NULL;
    HRESULT sts;
    
    OleInitialize(NULL);
    
    CLSIDFromProgID(L"InternetExplorer.Application", &clsid);

    CoCreateInstance(clsid, NULL, CLSCTX_ALL,IID_IUnknown, (LPVOID *)
&pUnknown);
 
    pUnknown->QueryInterface(IID_IWebBrowser2, (LPVOID *)&pBrowser);
 
    pBrowser->put_Visible(TRUE);
    sts = pBrowser->Navigate2(&_variant_t(lpszUrl),
                &_variant_t(),
                &_variant_t(),
                &_variant_t(),
                &_variant_t());

    MessageBox(NULL,"このボタンを押すとIEを閉じます", "閉じます", MB_OK);
    pBrowser->Quit();

    pUnknown->Release();
    pBrowser->Release();
    OleUninitialize();

     return 0;
}

古いスレッドには追加発言できません。