tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWebページの範囲選択につきまして
記事No16333
投稿日: 2017/07/05(Wed) 11:27
投稿者susu
度重ね、お世話になります。

環境
OS:Windows 7/8/10  IE 11   VB 6.0
VB歴は長いのですが詳しくはありません。

Webページの範囲選択につきましてご質問致します。

概要
以前から知りたかったWebページの範囲選択につきまして、ご質問致します。
keybd_event関数を使ってWebページを範囲選択[Ctrl+A](すべてが青色反転になります) 
すべての範囲選択を解除[Ctrl+D] (すべてが薄茶色反転になります)
色のつかない方法をショートカットキー一覧で調べましたが見つかりませんでした。
そこで範囲選択後に色のつかない状態に戻す方法としてF5キーを一度(更新)させて戻しています。

質問
F5キー(更新)させていますが範囲選択後に色のつかない状態に戻すことにつきまして
ご教示願えますと幸いであります。

[ツリー表示へ]
タイトルRe: Webページの範囲選択につきまして
記事No16334
投稿日: 2017/07/05(Wed) 16:44
投稿者魔界の仮面弁士
> 以前から知りたかったWebページの範囲選択につきまして、ご質問致します。
IE が対象なら、
 Call objInternetExplorer.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT)
で選択できます。


> 範囲選択[Ctrl+A](すべてが青色反転になります)
これは分かるのですが、

> すべての範囲選択を解除[Ctrl+D] (すべてが薄茶色反転になります)
こちらが分かりませんでした。

Photoshop 等では、Ctrl+D に解除が割り当てられていますが、
IE の [Ctrl+D] は、「お気に入りの追加」に割り当てられているはずです。
https://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E4%B8%80%E8%A6%A7


> そこで範囲選択後に色のつかない状態に戻す方法としてF5キーを一度(更新)させて戻しています。
選択状態を解除しても構わないのであれば、これで如何でしょう。

Dim selection As Object
Set selection = objInternetExplorer.Document.selection.createRange()
Call selection.setEndPoint("EndToStart", selection)
Call selection.select()

[ツリー表示へ]
タイトルRe^2: Webページの範囲選択につきまして
記事No16335
投稿日: 2017/07/05(Wed) 21:50
投稿者susu
魔界の仮面弁士 さん

返答をして頂きまして、ありごとうございます。

返答が遅れまして申し訳ありませんでした。

>> すべての範囲選択を解除[Ctrl+D] (すべてが薄茶色反転になります)
> これは分かるのですが、
範囲選択の解除を検索しましたら[Ctrl+D] でショットキーで試しましたら右上に
「ブックマーク」が表示されました。「お気に入りの追加」を範囲選択の解除と間違っていました。
> hhttps://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88%E3%82%AD%E3%83%BC%E4%B8%80%E8%A6%A7
提供して頂きましたショートカットキー一覧は今後使用させてもらいます。

> 選択状態を解除しても構わないのであれば、これで如何でしょう。
> Dim selection As Object
> Set selection = objInternetExplorer.Document.selection.createRange()
> Call selection.setEndPoint("EndToStart", selection)
> Call selection.select()
はい、ありがとう御座います。今後は、使わせてもらいます。

下記の、ご質問につきましてご教示願えますと幸いであります。

@のURLでは全ての選択は問題なくできました。
AのURLでは検索欄にカーソルがありWEBページが選択できませんでした。
手動では検索欄以外の部分を一度クリックして[Ctrl+A]しますと検索欄を除く
WEBページが範囲選択されました。

質問1
検索欄にカーソルがある場合、TABキーで送ったり、戻したり試しましたが
WEBページにより範囲選択されない場合もありました。
プログラムで、検索欄にカーソルがある場合でも範囲選択の方法はありますでしょうか。

質問2
Internet Explorer 以外のブラウザでは範囲選択の解除はできないものと考えてよいでしょうか。

参考として下記にしました。

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'
Option Explicit

Private Sub Command1_Click()

    Dim objInternetExplorer As InternetExplorer
    Set objInternetExplorer = CreateObject("InternetExplorer.Application")
    objInternetExplorer.Visible = True

    objInternetExplorer.Navigate "https://www.google.com/doodles"'@
    objInternetExplorer.Navigate "http://www.google.co.jp/"'A

     While objInternetExplorer.ReadyState <> READYSTATE_COMPLETE Or objInternetExplorer.Busy = True
        DoEvents
     Wend
    
                  '全てを選択
             Call objInternetExplorer.ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT)
              
                  'コピーは以下のWEBを参考にしました。
            'hhttps://msdn.microsoft.com/en-us/library/ms691264.aspx
                  'OLECMDID_COPY = 12 コピー
             Call objInternetExplorer.ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT)

                        
             '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
             '                          選択状態を解除
             Dim selection As Object
             Set selection = objInternetExplorer.Document.selection.createRange()
             Call selection.setEndPoint("EndToStart", selection)
             Call selection.Select
             '
             '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
             '

    Set objInternetExplorer = Nothing
  


End Sub
'
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

[ツリー表示へ]
タイトルRe^3: Webページの範囲選択につきまして
記事No16336
投稿日: 2017/07/05(Wed) 23:56
投稿者魔界の仮面弁士
> 選択状態を解除しても構わないのであれば、これで如何でしょう。
execCommand メソッドで、"ClearSelection" コマンドを発行した方が手っ取り早いかも。

https://msdn.microsoft.com/ja-jp/library/ms536419.aspx
https://msdn.microsoft.com/ja-jp/library/ms533049.aspx


> プログラムで、検索欄にカーソルがある場合でも範囲選択の方法はありますでしょうか。

選択前に、『どこを選択するのか』を定めておく必要があるでしょうね。

google サイトの例でいえば、ロード時に検索欄にフォーカスが移動していますので、
たとえばコピーを始める前に、body 要素をアクティブにするなどです。

 objInternetExplorer.Document.body.Focus
 objInternetExplorer.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT


また、フレームの問題もあります。たとえば、フレーム付きのサイトである
http://hanatyan.sakura.ne.jp/vbhlp/index.html
などは、どのフレームを選択状態にするのかを定めねばなりませんよね。


Option Explicit
Private WithEvents objInternetExplorer As InternetExplorer
Private Const targetUrl As String = "http://hanatyan.sakura.ne.jp/vbhlp/index.html"
Private Sub Command1_Click()
    Set objInternetExplorer = New InternetExplorer
    objInternetExplorer.Visible = True
    objInternetExplorer.Navigate2 targetUrl
End Sub
Private Sub objInternetExplorer_DocumentComplete(ByVal pDisp As Object, url As Variant)
    If url = targetUrl Then
        Dim frames As Object
        Set frames = pDisp.Document.frames
        Debug.Print frames.Length
        
        Dim frame As Object
        'Set frame = frames(0)    '左のフレーム(menu.htm)
        Set frame = frames(1)    '右のフレーム(top.htm)
        
        Dim doc As HTMLDocument
        Set doc = frame.Document
        doc.body.Focus
        
        pDisp.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT
        pDisp.ExecWB OLECMDID_COPY, OLECMDEXECOPT_DODEFAULT
        
        Dim selection As Object
        Set selection = doc.selection.createRange()
        selection.execCommand "ClearSelection"
    End If
End Sub

Private Sub objInternetExplorer_OnQuit()
    Set objInternetExplorer = Nothing
End Sub

Private Sub Form_Unload(ByRef Cancel As Integer)
    If Not objInternetExplorer Is Nothing Then
        objInternetExplorer.Quit
    End If
End Sub


> 質問2
> Internet Explorer 以外のブラウザでは範囲選択の解除はできないものと考えてよいでしょうか。
どのブラウザーをターゲットにするかで変わってくると思います。
(自作ブラウザーまで含めた、あらゆるブラウザーに対応するというのは流石に無理なので)

操作対象のアプリケーションによっては、UIAutomation から Invoke するとか、
IAccessible の accSelect メソッドなり accDoDefaultAction メソッドなりが
通じるケースもあるかもしれませんが、案件次第では、Selenium WebDriver を
利用できるかもしれません。いずれにせよ操作対象に依存するでしょう。

[ツリー表示へ]
タイトルRe^4: Webページの範囲選択につきまして
記事No16337
投稿日: 2017/07/06(Thu) 00:37
投稿者susu
魔界の仮面弁士 さん

度重ね、返答をして頂きまして、ありごとうございました。

返答をして頂きました回答には、サンプルまで提供してもらい

じっくり目を通し、調べて見たいと思います。

今回の質問とは別の質問をしてしまいました。

それに回答をして頂き、遅くまで長時間に渡り本当に申し訳ありませんでした。

心より感謝申し上げます。

[ツリー表示へ]
タイトルRe^5: Webページの範囲選択につきまして
記事No16338
投稿日: 2017/07/06(Thu) 09:02
投稿者susu
魔界の仮面弁士 さん

ご報告を致します。

>execCommand メソッドで、"ClearSelection" コマンドを発行した方が手っ取り早いかも。
範囲選択の解除は下記の方法でも確認できました。
'18, 0  '編集メニュー、コマンドのクリア
Call objInternetExplorer.ExecWB(OLECMDID_CLEARSELECTION, OLECMDEXECOPT_DODEFAULT)

>> プログラムで、検索欄にカーソルがある場合でも範囲選択の方法はありますでしょうか。
>選択前に、『どこを選択するのか』を定めておく必要があるでしょうね。
>google サイトの例でいえば、ロード時に検索欄にフォーカスが移動していますので、
>たとえばコピーを始める前に、body 要素をアクティブにするなどです。
 >objInternetExplorer.Document.body.Focus
 >objInternetExplorer.ExecWB OLECMDID_SELECTALL, OLECMDEXECOPT_DODEFAULT
『どこを選択するのか』を定めておく必要につきましては、大変参考になりました。

>また、フレームの問題もあります。たとえば、フレーム付きのサイトである
提供して頂きましたフレーム付き(右、左)のサイトで確かめることができました。

>> 質問2
>> Internet Explorer 以外のブラウザでは範囲選択の解除はできないものと考えてよいでしょうか。
>どのブラウザーをターゲットにするかで変わってくると思います。
>(自作ブラウザーまで含めた、あらゆるブラウザーに対応するというのは流石に無理なので)
(自作ブラウザーまで含めた、あらゆる・・・流石に無理なので)は、大変参考になりました。

以上の範囲選択につきまして、以前まではショットキーでできないものかと考え調べていましたが
1.『どこを選択するのか』を定めておく必要
2.(自作ブラウザーまで含めた、あらゆる・・・流石に無理なので)
1.2を考えますと思っていた以上に複雑で知りたかった事が明確になりスッキリできました。

本当にありがとうございました。心より深く感謝申し上げます。

[ツリー表示へ]