ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月20日(土) 16:14

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 14 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2006年5月23日(火) 17:02 
可能なのか、不可能なのか不明なので聞いてみるのですが
ABから現在開いてるIEを閉じる事って可能なのでしょうか?

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月23日(火) 20:15 
プロセスを閉じる事は、TerminateProcessかExitProcessで可能です。
指定されたページを開いているIEのプロセスのハンドルをどうやって判別するかがわかりません。

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

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月23日(火) 20:29 
追伸です。

PROXY Serverを作成し特定のページを開いたPPPセッションからプロセスのハンドルを取得できそうな気がします。
時間が有れば調べてみます。


通報する
ページトップ
   
投稿記事Posted: 2006年5月24日(水) 11:05 
オフライン

登録日時: 2005年5月31日(火) 18:51
記事: 473
お住まい: 新潟県
> もし、可能なのであれば特定のURLだけ閉じたいので、
> 出来ればその方法を教えて下さい。
回答にはなりませんけど...。
InternetExplorerのURL(アドレス)を取得しようとしたことを書きます。

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

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

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

デバイスコンテキストに描写されている文字列を取得できないかっていうトピックが有ったと思うんですけど、それができないと無理みたいです。たぶんですけどね。


通報する
ページトップ
投稿記事Posted: 2006年5月24日(水) 11:29 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
横レス失礼します。

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

誰か詳しい方、AB用に移植した上で使いやすいライブラリにまとめてくださると嬉しいです(激マテ。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月24日(水) 13:52 
オフライン

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

ちなみに、AucMonでIEからのD&D受け入れをやっています(宣伝…^^::)。

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
 記事の件名: hiraさんへ
投稿記事Posted: 2006年5月24日(水) 15:01 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
横道にそれますが、失礼します。
引用:
> IEからのD&D受け入れなら、OLEドラッグ&ドロップができればいいような気がします。プログラムからIEにD&Dでデータを送るにはフォーマットをCF_TEXTにしてURLを詰めればいいでしょう。
コレに関するレスをこちらにさせていただきました。


通報する
ページトップ
投稿記事Posted: 2006年5月24日(水) 16:06 
皆様、レス有難う御座います。
やはり特定の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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月24日(水) 17:07 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
その方法とは似ているようで似ていない別方法になりますが、
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)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月24日(水) 17:55 
イグトランスさん、コードを有難う御座いました。

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

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

コードを見ただけではよくわからないんです(汗)


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月24日(水) 19:11 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
そのとおりです。
何度も呼ぶのであれば、それすらも関数で包んでしまうのが楽でしょう。
コード:
Function CloseAllIEWindow() As BOOL
    CloseAllIEWindow = EnumWindows(AddressOf(EnumWindowsProc), 0)
End Function 


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月25日(木) 23:30 
イグトランスさんへ

早速組み込んでコンパイルしようとすると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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年5月26日(金) 00:11 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
すみません。
試行錯誤してみましたが無理みたいです。
単にDim className[ELM(8)] As Byteとしてください。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年5月26日(金) 00:47 
> 単にDim className[ELM(8)] As Byteとしてください。
有難うございます。
エラーも無事消えました。

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


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 14 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[18人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean