ブラウザを開く&閉じる – プログラミング – Home

ブラウザを開く&閉じる
 
通知
すべてクリア

[解決済] ブラウザを開く&閉じる


ゆき
 ゆき
(@ゆき)
ゲスト
結合: 21年前
投稿: 25
Topic starter  

お世話になります。
Win2000/MFCのアプリから,
1.ブラウザを起動し,特定のローカルHTMLを開く
2.開いたブラウザを閉じる
ということを実現したいと考えています。

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

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


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

ごめんなさい間違えました…
終了待機じゃないや、終了させたいんですね。
↑のレスは見なかったことにしてください。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

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 のウィンドウハンドルを取得するのはかなり難しいかもしんない。


返信引用
ぽこ
 ぽこ
(@ぽこ)
ゲスト
結合: 21年前
投稿: 23
 

ブラウザが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(LInternetExplorer.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;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました