IEで開いてるHPを閉じるには?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者

IEで開いてるHPを閉じるには?

#1 投稿記事 by »

可能なのか、不可能なのか不明なので聞いてみるのですが
ABから現在開いてるIEを閉じる事って可能なのでしょうか?

もし、可能なのであれば特定のURLだけ閉じたいので、
出来ればその方法を教えて下さい。
Tako

#2 投稿記事 by Tako »

プロセスを閉じる事は、TerminateProcessかExitProcessで可能です。
指定されたページを開いているIEのプロセスのハンドルをどうやって判別するかがわかりません。

特定のページを開いたら、全てのIEを終了させるなら可能だと思いますよ。

IEのコンテンツアドバイザーか、PROXY等を使用しパケットを遮断するのが一般的だと思いますが・・・
Tako

#3 投稿記事 by Tako »

追伸です。

PROXY Serverを作成し特定のページを開いたPPPセッションからプロセスのハンドルを取得できそうな気がします。
時間が有れば調べてみます。
7
記事: 473
登録日時: 2005年5月31日(火) 18:51
お住まい: 新潟県
連絡する:

Re: IEで開いてるHPを閉じるには?

#4 投稿記事 by 7 »

> もし、可能なのであれば特定のURLだけ閉じたいので、
> 出来ればその方法を教えて下さい。
回答にはなりませんけど...。
InternetExplorerのURL(アドレス)を取得しようとしたことを書きます。

EnumWindows()関数で、InternetExplorerのハンドルをすべて列挙して、その各ハンドルからエディットボックスのハンドルを取得しようとFindWindowEx()関数を使うんですけど、まずこの時点でエディットボックスのハンドルが取得できませんでした。

とりあえず、EnumChildWindows()関数で、各InternetExplorerの子ウィンドウをすべて列挙して、その各ハンドルからウィンドウ名を取得してもエディットボックスの内容(アドレス)は取得できませんでした。
じゃあ内容を設定してやったらどうだとSetWindowText()関数ですべての子ウィンドウの文字列を "aiueo" にしてやったんですけど全く外見は変わりませんでした。
※内部的には文字列はちゃんと設定されています。(?)

InternetExplorerのエディットボックスは "Edit" のクラスを使ってますけど、エディットボックスの機能は使わず、デバイスコンテキストにアドレスを描写してるみたいですね。たぶん。

デバイスコンテキストに描写されている文字列を取得できないかっていうトピックが有ったと思うんですけど、それができないと無理みたいです。たぶんですけどね。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

Re: IEで開いてるHPを閉じるには?

#5 投稿記事 by 淡幻星 »

横レス失礼します。

やはり、IEを外部から操作(閉じたり、表示中・選択中URLを取得したり)するのは
難しいみたいですね・・・。
私もIEからのD&Dを受け入れようと調べてみたのですが、
結局のところ、COMインターフェースを理解して
IEコンポーネント経由して操作する必要があるみたいです・・・。
http://www.nitoyon.com/vc/tips/ie_component.htm

誰か詳しい方、AB用に移植した上で使いやすいライブラリにまとめてくださると嬉しいです(激マテ。
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#6 投稿記事 by hira »

IEからのD&D受け入れなら、OLEドラッグ&ドロップができればいいような気がします。プログラムからIEにD&Dでデータを送るにはフォーマットをCF_TEXTにしてURLを詰めればいいでしょう。
ただ現状ではActiveBasicから動かすのが難しく(最近のバージョンならできる?)、C言語でDLLを作ってActiveBasicから呼び出す必要がありそうです。
↓私が参考にしたページ
http://www.nakka.com/lib/

ちなみに、AucMonでIEからのD&D受け入れをやっています(宣伝…^^::)。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

hiraさんへ

#7 投稿記事 by 淡幻星 »

横道にそれますが、失礼します。
> IEからのD&D受け入れなら、OLEドラッグ&ドロップができればいいような気がします。プログラムからIEにD&Dでデータを送るにはフォーマットをCF_TEXTにしてURLを詰めればいいでしょう。
コレに関するレスをこちらにさせていただきました。

Re: IEで開いてるHPを閉じるには?

#8 投稿記事 by »

皆様、レス有難う御座います。
やはり特定のURLだけってのは一筋縄ではいきそうにも無いみたいですね(汗)

そこで特定のURLだけ…と言うのは諦めて"全てのIEを終了する"と言った具合に仕様変更する事にしました。
TerminateProcessを使用してのプロセスの終了を過去ログ(管理人様書き込み)を参考にやってみたのですが、結果ダメでした。
他に無いものかと探してる内に下記のHPを見つけました。

◎VBからIEを閉じる
http://homepage1.nifty.com/MADIA/vb/vb_ ... 110088.htm

コード: 全て選択


  'VB用
    For Each IEApp In CreateObject("Shell.Application").Windows()
        If InStr(1, IEApp.fullname, "iexplore.exe", vbTextCompare) > 0 Then
            IEApp.Quit
        End If
    Next
↑コレをABに移植して貰えないでしょうか?
もしくは全てのIEを終了すると言ったコードをお願いしますm(_ _)m
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#9 投稿記事 by イグトランス »

その方法とは似ているようで似ていない別方法になりますが、
EnumWindowsでウィンドウハンドルを列挙し、IEのウィンドウに対して
(TerminateProcessよりはずっと行儀良く)WM_CLOSEを投げるようにしたらうまくいきました。

調べてみるとIEのウィンドウのクラス名は"IEFrame"となっていましたので、
それを使ってIEのウィンドウかどうか調べています。

コード: 全て選択

#strict

Const IEFRAME_CLASS = "IEFrame"

TypeDef BOOL = Long

TypeDef WNDENUMPROC = *Function(hwnd As HWND, lp As LPARAM) As BOOL

Declare Function EnumWindows Lib "User32" (pEnumFunc As WNDENUMPROC, lParam As LPARAM) As BOOL

Function EnumWindowsProc(hwnd As HWND, lp As LPARAM) As BOOL
	Dim className[Len (8)] As Byte ' "IEFrame"がちょうど収まる大きさ
	GetClassName(hwnd, className, Len (className))
	If lstrcmp(className, IEFRAME_CLASS) = 0 Then
		PostMessage(hwnd, WM_CLOSE, 0, 0)
	End If
	EnumWindowsProc = TRUE
End Function

EnumWindows(AddressOf(EnumWindowsProc), 0)

#10 投稿記事 by »

イグトランスさん、コードを有難う御座いました。

今、ちょっと試せない環境に居るので聞いてみるのですが、
関数定義を行った後はこの1行だけでIEを閉じる事が可能なのでしょうか?
" EnumWindows(AddressOf(EnumWindowsProc), 0)"

・・・と言うのもプログラムの中で何度か閉じる必要があるので、コマンド1発ではないですが気楽に使えたらと考えてまして。
(引数等は関数に投げずに楽に?!閉じたいので)

コードを見ただけではよくわからないんです(汗)
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#11 投稿記事 by イグトランス »

そのとおりです。
何度も呼ぶのであれば、それすらも関数で包んでしまうのが楽でしょう。

コード: 全て選択

Function CloseAllIEWindow() As BOOL
    CloseAllIEWindow = EnumWindows(AddressOf(EnumWindowsProc), 0)
End Function 

#12 投稿記事 by »

イグトランスさんへ

早速組み込んでコンパイルしようとすると2行目の所で"Len"が無効な識別子です とエラーになってしまいます。
(Dim className[Len (8)] As Byte の行)
どの様にしたら良いのでしょうか?^^;

ちなみに関数はプログラムの一番最初に置いてます。

コード: 全て選択


Function EnumWindowsProc(hwnd As HWND, lp As LPARAM) As BOOL
    Dim className[Len (8)] As Byte ' "IEFrame"がちょうど収まる大きさ
    GetClassName(hwnd, className, Len (className))
    If lstrcmp(className, IEFRAME_CLASS) = 0 Then
        PostMessage(hwnd, WM_CLOSE, 0, 0)
    End If
    EnumWindowsProc = TRUE
End Function
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#13 投稿記事 by イグトランス »

すみません。
試行錯誤してみましたが無理みたいです。
単にDim className[ELM(8)] As Byteとしてください。

#14 投稿記事 by »

> 単にDim className[ELM(8)] As Byteとしてください。
有難うございます。
エラーも無事消えました。

又、何かありましたら皆様宜しくお願いします。
返信する