C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■90511 / 6階層)  AddHandler Eventの別スレッドについて
□投稿者/ 魔界の仮面弁士 (2113回)-(2019/03/15(Fri) 11:55:19)
2019/03/15(Fri) 12:07:39 編集(投稿者)

解決済みで閉じられているので、いちおうチェックは付けた状態に戻しておきます。


No90477 (TanuTanu さん) に返信
> その結果、yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)の行にて下記エラーが発生致しました。

その行のどの部分に問題があるのかを確認してみてください。

NullReferenceException とは、インスタンスが空の時、すなわち
オブジェクトが Nothing である場合に、
そのメンバーを操作しようとして発生する例外ですよね。


If doc Is Nothing Then
 MsgBox("doc が空だった")
ElseIf doc.all Is Nothing Then
 MsgBox("doc.all が空だった")
ElseIf doc.all.item("yahoo") Is Nothing Then
 MsgBox("doc.all.item(""yahoo"") が空だった")
Else
 MsgBox("いずれも空ではなさそう")
 yahooButton = DirectCast(doc.all.item("yahoo"), mshtml.IHTMLElement)
End If




> FindWindowExWの値は0ですが、FindWindowではハンドル値取得できました。
> PWnd1 = FindWindowExW(IntPtr.Zero, IntPtr.Zero, "TabThumbnailWindow", "JavaScript テスト - Internet Explorer")

示されているのが結果だけで、要因となりうる情報が隠されたままなので、修正すべき箇所を指摘できないです。(^^;

あえてもう一度質問させていただきます。
『その API (FindWindowEx および FindWindowExW) の宣言部はどうなっていますか?』( No90475 の再掲 )


少なくとも当方では、下記の API 宣言で取得できています。

' Imports System.Runtime.InteropServices

' === 案1 ===
<DllImport("user32", CharSet:=CharSet.Unicode, SetLastError:=True)>
Private Shared Function FindWindowExW(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
End Function

' === 案2 ===
<DllImport("user32", CharSet:=CharSet.Auto, SetLastError:=True)>
Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
End Function

' === 案3 ===
Private Declare Unicode Function FindWindowExW Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> lpszWindow As String) As IntPtr

' === 案4 ===
Private Declare Auto Function FindWindowEx Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, <MarshalAs(UnmanagedType.LPTStr)> lpszClass As String, <MarshalAs(UnmanagedType.LPTStr)> lpszWindow As String) As IntPtr




宣言が間違っていて、IntPtr.Zero が返却されてしまうパターン。

' === 没1 ===
<DllImport("user32", EntryPoint:="FindWindowExW", SetLastError:=True)>
Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
End Function

' === 没2 ===
<DllImport("user32", SetLastError:=True)>
Private Shared Function FindWindowExW(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
End Function

' === 没3 ===
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExW" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr



正しい宣言ではないが、一応呼び出せてしまうパターン。

' === 非推奨1 ===
Private Declare Unicode Function FindWindowExW Lib "user32" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr

' === 非推奨2 ===
Private Declare Unicode Function FindWindowEx Lib "user32" Alias "FindWindowExW" (hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr



>  WEBページ・・・CreateObject("Shell.Application").Windowsで対応しております。
これを用いている部分のコードも見せていただけないでしょうか。

SHDocVw.ShellWindows を宣言しておきながら、FindWindowEx API や、GetIEDocument までも
追加で呼び出している理由が、どうしても分からなかったのです。

No90463 の発言より、「objIE.LocationName」を利用しているであろうことは推察できましたが、
目的は LocationName プロパティでウィンドウのタイトルを得ることだけなのでしょうか。
あるいは HWND プロパティからウィンドウハンドルも得ているとか?

objIE.Document プロパティを通じて HTMLDocument を得ることができるはずなので、
わざわざ GetIEDocument を呼び出す必要性は無いと思っています。( No90469 で指摘 )

(例)
http://jumbofoot.cocolog-nifty.com/yass_vbnet_tips/2007/02/shellhtmldocume_f1cd.html


WM_HTML_GETOBJECT でないと取得できない相手の場合は、API 宣言が必要になりますが、
その場合、今度は CreateObject("Shell.Application").Window を使う意味が分からない…。



>  上記WEBページから派生したWEBページダイアログ ・・・ GetIEDocument で対応(現在、ここのボタンクリックのイベントを対応しております。)

ここでいう『派生』とは何を示していますか? ページ遷移の事でしょうか?

ページが遷移したのであれば、以前の HTMLDocument はもう使えないので、
読み込みが完了したことを通知するための DocumentComplete イベントにて、
イベント引数 pDisp の Document プロパティを受け取るようにします。
(フレームを持つページの場合は、各フレームごとに発生することに注意)

あるいは、ターゲットとなる InternetExplorer オブジェクト(IWebBrowser2)を保持しておいて、
その Document プロパティを取得しなおすという方法も使えますが、いずれにせよ、
読み込みが完了する前に GetIEDocument なり Document プロパティなりで
HTMLDocument を得ていた場合、DOM が不完全な状態になっていることがあります。

なので、取得した HTMLDocument が、目的のページの内容を指しているかを
確認しておくことも重要です。(これも No90469 で指摘 )


それに、FindWindowEx を使うにしても、その使い方が不自然に思えます。
そもそも "TabThumbnailWindow" クラスを探している理由は何でしょうか?
先の GetIEDocument を使うことが目的なら、探すべきウィンドウは
"Internet Explorer_Server" クラスのウィンドウ(またはその親ウィンドウ)の
ハンドルであるはずですよね。


また、「WEBページダイアログ」とは何を指していますか?
キャプションが "JavaScript テスト - Internet Explorer" となる、 No90454
https://www.javadrive.jp/javascript/event/sample2_1.html だとすれば、
そもそもダイアログは存在していません。
別のページが対象なのかもしれませんが、その場合は、doc.all.item("yahoo") は存在しないかもしれませんし。

No90476 では「javascriptによる擬似モーダルダイアログ『だと思う』」とお答えいただきましたが、
それが具体的になんであるのか(たとえば jQuery の colorbox とか)や、
イベント割り当てが onclick なのかそれ以外なのかもはっきりしないままです。
解決済み
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[5]: AddHandler Eventの別スレッドについて /TanuTanu 返信無し
 
上記関連ツリー

AddHandler Eventの別スレッドについて / TanuTanu (19/03/11(Mon) 14:26) #90434
Re[1]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/11(Mon) 18:02) #90439
│└ Re[2]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/11(Mon) 20:50) #90440
Re[1]: AddHandler Eventの別スレッドについて / Azulean (19/03/11(Mon) 21:06) #90441
  └ Re[2]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/12(Tue) 11:11) #90444
    ├ Re[3]: AddHandler Eventの別スレッドについて / PANG2 (19/03/12(Tue) 12:31) #90446
    │└ Re[4]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/12(Tue) 13:17) #90452
    ├ Re[3]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/12(Tue) 14:24) #90454
    │└ Re[4]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/12(Tue) 14:31) #90455
    │  └ Re[5]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/12(Tue) 15:03) #90456
    │    └ Re[6]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/12(Tue) 17:37) #90458
    │      └ Re[7]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/12(Tue) 18:32) #90461
    │        └ Re[8]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/12(Tue) 19:54) #90463
    │          ├ Re[9]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/13(Wed) 09:51) #90469
    │          └ Re[9]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/13(Wed) 09:32) #90468
    │            └ Re[10]: AddHandler Eventの別スレッド / TanuTanu (19/03/13(Wed) 14:49) #90473
    │              └ Re[11]: AddHandler Eventの別スレッド / 魔界の仮面弁士 (19/03/13(Wed) 16:03) #90475
    └ Re[3]: AddHandler Eventの別スレッドについて / PANG2 (19/03/13(Wed) 16:01) #90474
      └ Re[4]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/13(Wed) 16:55) #90476
        ├ Re[5]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/13(Wed) 20:27) #90477
        │└ AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/15(Fri) 11:55) #90511 解決済み ←Now
        └ Re[5]: AddHandler Eventの別スレッドについて / PANG2 (19/03/14(Thu) 18:59) #90492
          └ Re[6]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/15(Fri) 10:28) #90508 解決済み
            └ Re[7]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/18(Mon) 16:52) #90531
              └ Re[8]: AddHandler Eventの別スレッドについて / 魔界の仮面弁士 (19/03/18(Mon) 18:18) #90533
                └ Re[9]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/19(Tue) 20:43) #90543
                  └New Re[10]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/20(Wed) 14:04) #90547
                    └New Re[11]: AddHandler Eventの別スレッドについて / TanuTanu (19/03/20(Wed) 23:14) #90556
                      └New Re[12]: AddHandler Eventの別スレッドについて / PANG2 (19/03/21(Thu) 07:17) #90557

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信