• ベストアンサー

GetWindowTextでアドレスバーからURLを取得したい

VB6.0でGetWindowTextを使用し、ブラウザ(IE)のアドレスバー部に 表示されているURLを取得したいと考えています。 ウィンドウハンドルを取得してキャプションを得るということに なると思うのですが、下記の内容においてGetWindowTextLengthの 戻り値がどうしても0になってしまいます。 URLはキャプションとして取得できないのでしょうか。 同じ方法でブラウザのタイトルバーの文字列を取得できることは 確認できています。 おわかりになられる方いらっしゃいましたら、よろしくお願い致します。 Private Sub Command3_Click() Dim hwnd As Long Dim Rc As Long Dim Str As String Dim Bite As Long hwnd = "&H" & アドレスバー部のウィンドウハンドル 'Rc = キャプションのバイト数 Rc = GetWindowTextLength(hwnd) MsgBox Rc 'エラーチェック If Rc = 0 Then Exit Sub 'キャプションのバイト数分のバッファ確保 Str = String(Rc, vbNullChar) 'Bite = キャプションのバイト数 'Str = キャプション文字 Bite = GetWindowText(hwnd, Str, Rc) 'Text1.Text = Str の左端の文字からキャプションのバイト数分 Text1.Text = Left(Str, Bite) End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★注意点とアドバイス ・『GetWindowText』関数や『GetWindowTextLength』関数は、他のプロセスのキャプションを  正しく取得できません。→SDK マニュアルにそう載っていました。 ・そこで『WM_GETTEXT』、『WM_GETTEXTLENGTH』メッセージを『SendMessage』などで送って  取得して下さい。 ●サンプル 'Rc = キャプションのバイト数 Rc = SendMessage( hwnd, WM_GETTEXTLENGTH, 0, 0 ) 'Str = キャプション文字 Bite = SendMessage( hwnd, WM_GETTEXT, Rc, Str ) 'Text1.Text = Str の左端の文字からキャプションのバイト数分 Text1.Text = Left( Str, Bite ) 最後に: ・私は、C/C++ 言語屋です。 ・SendMessage 関数の引数『Rc』、『Str』に C/C++ では(WPARAM)や(LPARAM)にキャストして  使います。→VB ではどうなのか分かりませんが、この辺にも注意して下さい。 ・以上。短いですが終わりです。

bodyspecial20
質問者

お礼

早速のご回答ありがとうございました。 SendMessageの引数『Rc』『Str』をByValで渡してやることで うまくキャプションを取得することができました。 本当にありがとうございました。

その他の回答 (2)

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.3

ANo.2 Oh-Orangeさんの回答を拝見して気づきました。 WM_GETTEXTの戻り値を使えば、改めてNULL文字までの長さを求める必要はなかったですね。ANo.1の回答を訂正致します。m(__)m Windows XP SP2 + Delphi2006で試しました。

  • SHIMAPEE
  • ベストアンサー率75% (154/203)
回答No.1

IEのアドレスバーのクラス名はEditのようです。 MSDNによりますとGetWindowTextLengthは「他のアプリケーションのエディットコントロールのテキストの長さを取得することはできません。」 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getwindowtextlength.asp 同じくGetWindowTextも「他のアプリケーションのコントロールのテキストを取得することはできません。」 http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpwinui/html/_win32_getwindowtext.asp ある程度バッファを確保してWM_GETTEXTメッセージを送ってテキストを取得する、その後、長さが必要であればNULL文字までの長さを求める、しかなさそうです。 VB6ではありませんがWindows XP SP2 + Delphi2006で試しました。

bodyspecial20
質問者

お礼

No.3と合わせて、早速のご回答ありがとうございました! まず、MSDNで調べてみるべきでした。 SendMessageでGetWindowTexを投げてやることで無事 キャプションを得ることができました。

関連するQ&A

  • アクティブウインドウのIMEコンテキスト取得を取得したい。

    アクティブウインドウのIMEコンテキスト取得を取得したい。 以下、問題のコードです。 ---ここから 'アクティブウインドウのハンドルを取得API宣言 Private Declare Function GetActiveWindow Lib "user32" () As Long 'IMEコンテキスト取得API宣言 Private Declare Function ImmGetContext Lib "imm32.dll" _ (ByVal hWnd As Long) As Long Private Sub CommandButton1_Click() 'アクティブウインドウのハンドルを取得 Dim hWnd As Long hWnd = GetActiveWindow() 'IMEコンテキスト取得 Dim himc As Long himc = ImmGetContext(hWnd) End Sub ---ここまで 上記のコードでアクティブウインドウ(上記例の場合、エクセル)でのIMEコンテキスト取得 したいと思っています。 hWndでは、ハンドルを取得できているのですが、 himcの戻り値が0になってしまって、IMEコンテキスト取得が失敗しています。 目的は、アクティブウインドウでのIMEの入力をローマジ入力の半角英数のみにすることです。 そのため、IMEコンテキスト取得を取得したいのですが、上記方法のどこがいけないでしょうか? どうぞよろしくお願いします。 言語:VBA(Excel 2007) OS:Vista

  • エクセル(複数インスタンス)より任意のWorkBookを取得したい

    VB初心者です。非常に困っていますのでどうぞ宜しく御願いいたします。  起動中のエクセルをVB6.0からコントロールしたいと思い、以下のコードを書いたのですが、エクセルが複数インスタンスで起動している場合、意図するワークブックが取得できないことに気が付きました。(一番初めに起動したインスタンスのエクセルしか取得できませんでした) ■失敗■ Private Sub Command1_Click()  Set xlApp = GetObject(, "Excel.Application")  xlApp.ActiveWorkbook.Sheets("シート名").Select 'アクティブなWorkBookを取得  Err.Clear  On error resume next  If Err.Number <> 0 Then  MsgBox"エラー"  Else  msgBox"取得成功"  End If  Err.Clear  On error goto 0 End Sub  そこで、全てのエクセルのウィンドーテキストを取得し、そこから意図するエクセルオブジェクトを取得しようと、ネットで調べながら以下のプログラムを試してみました。結果、List1に全てのインスタンスのワークブック名を取得することはできましたが、肝心のGetObjectで「オートメンーションの操作中にファイル名またはクラス名を見つけられませんでした。」というエラーが発生し失敗してしまいました。 ■失敗■ 'Windowの生成API Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long Private Sub Command1_Click() 'コントロールするエクセルの列挙 Dim lBookNameLenghth As Long Dim strBuffer As String Dim lChild As Long Const lBufferSize As Byte = 255 strBuffer = String(lBufferSize, Chr(0)) List1.Clear Do Counter = Counter + 1 lChild = FindWindowEx(0, lChild, "MS-SDIa", vbNullString) If lChild = False Then Exit Do lBookNameLenghth = GetWindowText(lChild, strBuffer, lBufferSize) List1.AddItem Left(strBuffer, lBookNameLenghth) Loop While lChild End Sub Private Sub List1_Click() If List1.Text <> "" Then Set xlApp = GetObject(List1.Text, "Excel.Application") '←ここでエラー発生 End If End Sub どんな方法でも構いませんので、全てのインスタンスのエクセルを対象としたエクセルオブジェクト取得方法を教えてください。 環境:Windows2000 Professional+VB6.0+Office2000 以上、宜しく御願いいたします。

  • excelVBAからC#へsendmessage

    excelのVBAから文字列をsendmessageで C#のプログラムに文字列を渡せないかと考えています。 ネットで調べつつなんとか作ってみたのですが、 どうしてもうまく動作しません。 変な文字列が表示されてしまいます。 どこがおかしいか教えて頂けないでしょうか。 windows7、Excel2010、.netFramework4になります。 ※※※excel VBA側プログラム※※※※※※※※※※※※ //外部functionを使いますよ Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _ (ByVal hwd As Long, ByVal Msg As Long, ByVal wpara As Long, lpara As COPYDATASTRUCT) As Long //構造体 Public Type COPYDATASTRUCT dwData As Long cbData As Long lpData As String End Type //メッセージを送信するsub Public Sub sousin() Dim result As Longv Dim hWnd As Long Dim cds As COPYDATASTRUCT Dim str As String Dim strby() As Byte Dim length As Long  ~ ウィンドウハンドルの取得 ~ str = "test" strby = StrConv(str, vbFromUnicode) length = UBound(strby) - LBound(strby) + 1 cds.dwData = 0 cds.lpData = str cds.cbData = length result = SendMessage(hWnd, WM_COPYDATA, 0, cds) End Sub ※※※C#側プログラム※※※※※※※※※※※※※※※ //構造体 public struct COPYDATASTRUCT { public long dwData; public long cbData; public string lpData; } //WndProc関数 protected override void WndProc(ref Message m) { switch (m.Msg) { case WM_COPYDATA: COPYDATASTRUCT mystr = new COPYDATASTRUCT(); Type mytype = mystr.GetType(); mystr = (COPYDATASTRUCT)m.GetLParam(mytype); label1.Text = mystr.lpData;           ←※無茶苦茶な文字列になります break; } base.WndProc(ref m); }

  • 二つの期間が何か月か取得する方法はありますか?

    例えば Sub test() Dim str期間 As String Dim 開始 As Date Dim 終了 As Date str期間 = "2014/07/09~2014/07/8" 開始 = Left(str期間, 10) 終了 = Mid(str期間, 12) End Sub この場合は、12か月を取得するには この続きをどうすればいいでしょうか? str期間 = "2014/07/01~2014/07/31" も12か月、 str期間 = "2014/07/09~2014/07/31" も12か月を返すにはどうすればいいですか?

  • VB2010 ウィンドウタイトルを取得

    こんにちはVB学習を始めて2週間になりました。 Webの記事などを参考にしていますがバージョンによって記述が変わって苦戦しています。 今回ご質問したい内容です。 ボタンを押すとメモ帳が起動されているか調べてそのウィンドウタイトルを得る ウィンドウタイトルで検索してハンドルを取得してそのままそのハンドルで逆に ウィンドウタイトルを得ています(無意味な処理ですが学習用という事で) Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hWnd As Integer, ByVal lpString As String, ByVal nMaxCount As Integer) As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim ECHandle As Integer Dim Titlename As String Titlename = vbNullString ECHandle = FindWindow(vbNullString, "無題 - メモ帳") GetWindowText(ECHandle, Titlename, 255) Label5.Text = Titlename If ECHandle = 0 Then Label4.Text = "取得できない" Else Label4.Text = "取得出来た" & ECHandle & Titlename End If End Sub 結果はというと Titlename が空っぽのままでタイトルが取得できません どのような原因が考えられますでしょうか? よろしくお願いいたします。

  • VB BitBlt他でのエラー

    ネットを見ながらVisual Basicを触り始めたのですが、下記のようなコードを実行すると「スタックを不安定にしています」といった感じのエラーが出てしまいます。 多分基本的な見落としだとは思うのですが、調べても上手い解決策が見つからず、質問させて頂いた次第です。  どうか、皆様のお知恵をお貸しください。 ・環境 Windows7 64bit - Microsoft Visual studio2017 - Visual Basic - Windowsデスクトップ - Windowsフォームアプリケーション ・やりたい事 別ソフトのウィンドウのタイトル、座標、画像を取得したい。 ・エラー 下記コードを開始(上の緑の三角)して実行すると、(1)のGetForegroundWindowは問題ないのですが、(2)のGetClientRect、(3)のGetWindowText、(4)のBitBltの部分を実行する際に、次のようなエラーが出てしまいます(3か所とも、関数名以外は同じエラーです)。 マネージド デバッグ アシスタント 'PInvokeStackImbalance' Message=マネージド デバッグ アシスタント 'PInvokeStackImbalance' : 'PInvoke 関数 'WindowsApp1!WindowsApp1.Form1::BitBlt' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメーターがターゲットのアンマネージ シグネチャに一致していることを確認してください。' ・コード Imports OpenCvSharp Public Class Form1 Declare Function GetForegroundWindow Lib "user32" () As Long Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As Rect) As Long Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal nMaxCount As Long) As Long Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Public Const SRCCOPY = &HCC0020 'S Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click System.Threading.Thread.Sleep(1000) '指定ミリ秒待機する Dim hWnd As IntPtr = GetForegroundWindow() '(1)選択ウィンドウのハンドルを取得 'Dim winRect As New Rect 'GetClientRect(hWnd, winRect) '(2)ウィンドウ座標取得 Dim Title As String = Space(255) Dim ret As Long = GetWindowText(hWnd, Title, Len(Title)) '(3)ウィンドウのタイトルを取得 Title = Microsoft.VisualBasic.Left(ret, InStr(ret, vbNullChar) - 1) Dim img As IntPtr BitBlt(img, 0, 0, 100, 100, hWnd, 0, 0, SRCCOPY) '(4)ウィンドウの画像を取得 End Sub End Class

  • テキストファイルの中からURLを抽出するには?

    VBAで読み込んだテキストファイルからURL部分だけを抽出するにはどうしたらよいでしょうか? InStr関数とMid関数を使って、先頭:http~終わり:空白 or Chr(13)をURLとして切り取っているのですがうまく行きません。 どうも終わり部分の判定が甘いようです。 Sub GetURL(myText)     'テキストからURLを抽出  Dim myText As String  Dim myURL As String   'URL取り込み用  Dim str_pt As Long     '文字列用ポインタ  str_pt = 1          '最初は1文字目から  Do While 1   str_pt = InStr(str_pt, myText, "http")   If str_pt = 0 Then Exit Do   Do While 1    letter = Mid(myText, str_pt, 1)    If letter = Chr(20) Or letter = Chr(13) Then Exit Do    myURL = myURL & letter    str_pt = str_pt + 1   Loop   Debug.Print myURL   myURL = ""  Loop End Sub アドバイスをお願いします!

  • EditBoxの内容を取得する方法

    Active Basicを使ってプログラムを作成しています。 まだまだはじめたばかりの初心者なので、電卓プログラムを作ってみようと決めて、作り始めました。 しかし、EditBoxから文字列を数字として取得する部分がどうしても出来ません。 Dim Buffer As BytePtr Dim Length As Long Length = GetWindowTextLength(hEditBox) Buffer = calloc(Length+1) GetWindowText(hEditBox,Buffer,Length+1) MessageBox(hEditBox,Buffer,NULL,MB_OK) free(Buffer) こういったコードを指定してみました。 文字列としては取得できますが、数字としての取得が出来ず、 取得した後、足したり引いたりすると、文字化けが生じます。 EditBox内の数字をそのまま変数にコピーする方法を御願いします。 分かりにくくてすみません・・・

  • 【vba】「CStr」と「Str」は同じ意味ですか?

    Sub 数値を文字型に変更() Dim i As Long Dim moji As String i = 1 moji = CStr(i) moji = Str(i) End Sub 上記のコードで得られる結果は同じです。 "1"になります。 「CStr」でも「Str」でも数値を文字列に変換しています。 ということは「CStr」でも「Str」は同じなのですか? しかしコードの表示色が 「CStr」→キーワード 「Str」→識別子 です。 これが違うと言うことは何かが違うのでしょうか?  よろしくお願いします。

  • Excel2003VBAでクリップボードにあるビットマップの操作について

    Excel2003VBAにおいてクリップボードにあるビットマップの画像の任意の1pxの色を、 ペイントのスポイトツールのように取得するマクロを作成したいのですが GetPixelという関数で画像の任意1pxの色を取得できる所までは調べられたのですが、 それをクリップボードの画像で使用することができませんでした。 以下は、GetPixel関数を試してみた時のソースになります。 '------------------------------------------------------------------ Option Explicit Declare Function GetDesktopWindow Lib "user32" () As Long Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub ピクセル色獲得() Dim hwnd As Long Dim hdc As Long hwnd = GetDesktopWindow() hdc = GetWindowDC(hwnd) Debug.Print Hex(GetPixel(hdc, 100, 200)) End Sub '------------------------------------------------------------------ 上記ソースで任意1pxの色を取得できたため クリップボードの画像の色を取得するマクロを下記のように作成しました。 '--------------------------------------------------------------- Option Explicit Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal Y As Long) As Long Sub クリップボードピクセル色獲得() Dim CB As Variant Dim i As Long CB = Application.ClipboardFormats Debug.Print Hex(GetPixel(CB, 100, 200)) End Sub '--------------------------------------------------------------- 型が一致しません と言われ動きません。 以上です、よろしくお願いいたします。

専門家に質問してみよう