DOBON.NETプログラミング道掲示板

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomalエンターキーでのコントロール移動(1) | Nomalメッセージの表示(1) | NomalThreading.Threadで戻り値を取得したい(8) | NomalPOSTとブラウザで動きが違うのはなぜでしょう?(6) | NomalUIスレッド使用中のBeginInvoke(5) | Nomal【急募】プログラミング、ネット関係詳しい人!!(0) | NomalForm起動時の例外スローが発生する原因が知りたい(1) | NomalASP.NET(VB.NET)でMapHubsを利用したい(2) | NomalForm1内のForm2でのTextBox入力がうまくいかない(6) | NomalnpgsqlでのExecuteScalarとExecuteReaderの扱いについて(2) | Nomalすきーむ りすと(2) | Nomalユーザーコントロールで自作のBackColorプロパティを使いたい(3) | NomalDataGridViewのRowLeaveのキャンセルについて(1) | Nomalプロパティウィンドウのカスタマイズ(2) | NomalCSV出力時に対象データバイト数+crlfの2バイト分のNull文字が出力される(4) | NomalIE11のダウンロード通知バーの保存を押したい(2) | Nomalmagick.net c# PDFの総ページ数取得(2) | NomalレジストリCLSIDの検索(4) | Nomalウィルスバスターについての質問(2) | NomalVB6からC#への変換時のエラー(1) | Nomal文字列配列からCheckedListBoxにチェック適用(4) | NomalC# Excelの列名の取得(3) | NomalWinサービスのサービス名をconfig化したい(1) | Nomalバッチで最新の環境変数を取得したい(4) | NomalWin7で開発したソフトがWin10で動かない(2) | Nomalテキストボックスのプロパティno(2) | NomalInternet Explorer Webページ保存のデフォルトフォルダ(1) | NomalASP.NETでネットワーク接続が切れた場合(0) | Nomalvb.net複数行入力テキストでのRETURNでの改行ができない(6) | Nomal中国語OSのFrameworkインストール画面の文字化け(1) | NomalExcelファイル内の画像取り込み(2) | NomalC# npgsqlでの動作(2) | Nomalコンボボックス継承で独自フォームの表示(1) | Nomalあらゆる例外がTargetInvocationExceptionで出力される。(5) | NomalListViewのページは指定できるのでしょうか?(ASP.NETではありません)(2) | Nomal追加したイベントハンドらが動かない。(2) | Nomalマルチディスプレイ環境で任意のモニターに描画したい(5) | NomalC#からのメール送信エラー(2) | Nomalメールの送信結果通知(2) | NomalVS2015,C#・・・別アプリ起動IEの表示ページのURL取得は?(4) | NomalVS2015のListViewにて、行挿入されない(2) | NomalVB.NETからエクセル(アクティブセル)への画像挿入(4) | NomalPowerShellで文字列を変数に変換したい(8) | NomalVisual Studio 2015 のビルドエラー表示のタイミング(2) | Nomalダウンキャストの実装を簡潔に記述したい(3) | Nomal(C#)BitArray同士の比較(1) | Nomalカスタムページサイズでの印刷(0) | Nomalフォームの表示位置を揃えたい(4) | Nomalユーザーコントロールをツールバーに表示できない(6) | Nomalforループの並列化とUI操作について(1) | NomalSQLをVBでUAC有効未昇格ClickOnceで操作したい(2) | NomalVB6 + Windows7 処理がおちる(3) | NomaltoolStripContainerの中でtoolStrip同士を重ねたい(1) | Nomal画像を見ていただき使っているどのコントローラーが使われているのか教えてください。(3) | Nomal外部アプリのマウスクリック無効化について。(2) | NomalDataGridViewにおいたComboBoxの表示(4) | Nomaldllのパス(6) | NomalVS2015 Express インストール時のエラー(3) | Nomalvb.netでの彩度調整(5) | Nomalカスタムコントロール作成について(2) | Nomalwebbrowserでjqueryのイベントを発生させたい(3) | Nomalfor文について(超初心者向け)(0) | Nomal【お知らせ】ファイルアップロード機能の停止等、変更を行いました(1) | Nomalデータグリッドビューのセル内テキストの部分選択(2) | Nomalフォームを連続表示後、最後のフォームをアクティブにしたいが出来ないのです(0) | NomalWebページのWebClient取得が失敗する(1) | NomalWebAPIがうまいこと動きません(0) | NomalPanel上のDataGridviewにてタブ移動時のScrollイベント取得について(2) | NomalDBの数値型カラムのサイズを取得する方法(2) | Nomalチェックボックスでチェックしたものだけをツリービューの階層通りにコピーしたい(6) | NomalSleepの使い方(2) | Nomalドキュメントアウトラインでの要素移動(2) | Nomal背景が透明のアニメGIFを作成したい(3) | NomalWebBrowserのopener.location.hrefの値取得(1) | Nomal検索結果を任意のタイミングで元フォームに知らせる(4) | NomalEclipseのrun as とopen with web browser(0) | NomalDaTaGidViewに入力されたデータの反映方法(0) | Nomalイベントハンドラ内でのメソッド呼び出し(2) | Nomal文字列描写時の縁の太さを大きく指定すると縁が飛び出る現象(2) | Nomalネットワーク越しのFileSystemWatcher(7) | NomalCopyFromScreenのキャプチャ画像ズレとディスプレイの高DPI設定(3) | NomalReportViewerで、表の背景色を段違いにしたい(0) | NomalPHPでPOST変数の一括初期化(2) | Nomal可読性が悪いので名前空間を追加しないよう改善してほしい(2) | NomalC#で作成したDLLがVB6.0で利用できない(15) | NomalVB.NETでネットワークドライブの割り当てダイアログを表示したい(7) | Nomal定期的なバックグランド処理で「SleepとWhile文を使用した方法」を使うケースについて(5) | NomalDataRepeater MaskedTextBox SelectAll出来ない(5) | NomalSQL Server Management Studioでテキスト表示(0) | NomalStreamReader/Writer使用後にファイルを削除したい(1) | Nomalフォーム画面の保存(3) | Nomalプロパティウィンドウに表示されないプロパティとは(5) | Nomal動的コントロールの値によってさらに動的コントロールを画面に表示したい(5) | Nomalミリ秒とGMTなしでのDateTimeのシリアル化(3) | NomalMicrosoft Visual Studio 6.0がについてインストール時のエラー(6) | NomalIsVisible の具体的な補正方法を教えてください(2) | Nomalモバイルデバイス上のsdfへの接続文字列(4) | NomalwebブラウザコントロールとIEの挙動の違い(1) | Nomalwebbrowserとソース表示が違うのですが。(6) | NomalClickOnceで発行したアプリケーションでエラーが発生する(3) |



■記事リスト / ▼下のスレッド
■33678 / 親記事)  エンターキーでのコントロール移動
□投稿者/ み 一般人(28回)-(2017/09/21(Thu) 17:06:59)
  • アイコン環境/言語:[Windows10 Vstudio2012 C#] 
    分類:[.NET] 

    以下のURLコードにより
    エンターキーによる(TABによる遷移)を実装しました。
    https://dobon.net/vb/dotnet/control/enterliketab.html

    通常のテキストボックスは正常に動作するのですが
    コンボボックスは2度ProcessDialogKeyが実行されて
    次の次のコントールに移動してしまいます。

    この回避方法があれば教えて下さい

    protected override bool ProcessDialogKey(Keys keyData)
    {
    switch (keyData)
    {
    case Keys.Enter:
    this.SelectNextControl(
    this.ActiveControl, true, true, true, true);
    break;
    }
    return true;
    }
違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■33681 / ResNo.1)  Re[1]: エンターキーでのコントロール移動
□投稿者/ 魔界の仮面弁士 大御所(1083回)-(2017/09/22(Fri) 10:27:56)
  • アイコンNo33678に返信(みさんの記事)
    > 以下のURLコードにより
    > エンターキーによる(TABによる遷移)を実装しました。

    サイトで紹介されているサンプルとは、微妙に異なっていますね。

    元のコードとは異なり、Tab キーによる標準遷移が殺されてしまっていますし、
    Shift キーを併用した逆送りも無くなって、使いにくくなっているように
    感じるのですが、あえてそうしているのでしょうか。


    > 通常のテキストボックスは正常に動作するのですが
    > コンボボックスは2度ProcessDialogKeyが実行されて
    > 次の次のコントールに移動してしまいます。

    元のコードと、今回提示頂いたコードの両方を試してみましたが、
    当方では再現しませんでした。
    他にコードを書いていたりはしないですよね?


    【Enter 時に、ProcessDialogKey が 2 度以上呼ばれたケース】
    ・該当現象を確認できず。


    【Enter 時に、ProcessDialogKey が 1 度だけ呼ばれたケース】
    ・DropDownStyle = DropDown (ドロップダウンしていない状態)の場合
    ・DropDownStyle = DropDownList (ドロップダウンしていない状態)の場合


    【Enter 時に、そもそも ProcessDialogKey が呼ばれなかったケース】
    ・DropDownStyle = Simple (テキスト部がアクティブ)の場合
    ・DropDownStyle = Simple (リスト部がアクティブ)の場合
    ・DropDownStyle = DropDown (ドロップダウンしている状態)の場合
    ・DropDownStyle = DropDownList (ドロップダウンしている状態)の場合
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-1]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■33679 / 親記事)  メッセージの表示
□投稿者/ ほほ 一般人(1回)-(2017/09/21(Thu) 19:12:55)
  • アイコン環境/言語:[Windows7 VB.net2010] 
    分類:[.NET] 

    はじめまして。VB初心者ですがよろしくお願いします。

    普段、VBのフォームを最小化しておいて
    時間が経過すると(何かのタイミング)フォームを普通の状態にして
    ( FormWindowState.Normal)
    PCモニターの右上にメッセージ表示するプログラムの作成を考えています。

    また、PCでは数字入力するソフトを使ていまして
    カーソルを常にそのソフト置いておきたいです。

    使っているソフトに主導権を与えながら
    VBでメッセージ表示する方法ありましたら
    教えていただきたいです。

    宜しくお願いいたします。
違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■33680 / ResNo.1)  【報告】この投稿はマルチポストです
□投稿者/ (報告) 大御所(266回)-(2017/09/21(Thu) 21:55:26)
  • アイコンこの投稿はマルチポストです。もし元記事の投稿者にマルチポストの心当たりがない場合は、すぐに返信でお知らせください。

    ●マルチポストされている場所
    http://bbs.wankuma.com/index.cgi?mode=al2&namber=85221

    ----------
    この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのルールについて」をお読みください。

    ●書き込みのルールについて
    https://dobon.net/vb/bbs/index.html
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-1]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■33668 / 親記事)  Threading.Threadで戻り値を取得したい
□投稿者/ ゆう 一般人(1回)-(2017/08/31(Thu) 11:20:08)
  • アイコン環境/言語:[Framework 2.0] 
    分類:[.NET] 

    Threading.Threadで呼び出した関数の戻り値を取得したいのですが
    何か方法はありますか?
違反を報告
引用返信

▽[全レス8件(ResNo.4-8 表示)]
■33672 / ResNo.4)  Re[3]: Threading.Threadで戻り値を取得したい
□投稿者/ 魔界の仮面弁士 大御所(1079回)-(2017/08/31(Thu) 17:02:40)
  • アイコンNo33671に返信(ゆうさんの記事)
    > 案2を実装しようと思い自分なりにコードをVBに変えたのですが文法エラーが直りません

    言語指定がありませんでしたが、今回は Visual Basic で実装されるのですね。


    > Public Class Program
    > Sub Main(Args() As String)

    これはコンソールアプリケーションでしょうか?
    だとしたら、VB で書く場合は、

     Public Class Program
      Shared Sub Main(Args() As String)

    もしくは

     Public Moudle Program     '既定では Module1 ですが名前は任意
      Sub Main(Args() As String)  '既定では 引数なし

    にしなければなりません。
    ※プロジェクトのプロパティ「アプリケーション」タブの『スタートアップ オブジェクト』も確認を。



    > →Visual Basic 9.0はこのラムダ式をサポートしていません

    9.0 ということは、VB2008 をお使いでしょうか。
    であればラムダ式を使わずに、AddressOf で記述してみてください。


    .NET Framework 2.0 であっても、Sub による複数行ラムダ式は使えますが、
    コンパイラは 10.0 (VB2010) 以降が必要になります。

    VB2008 で使えるラムダ式は、Function による単一行ラムダのみであり、
    複数行ラムダはおろか、Sub のラムダ式さえサポートしていません。


    Public Class ThreadBuilder
     Public Delegate Function MethodDelegate(Of T)() As T
     Public Delegate Sub CallbackDelegate(Of T)(ByVal ReturnValue As T)
     
     Public Shared Function NewThread(Of T)(ByVal Method As MethodDelegate(Of T), ByVal CallBack As CallbackDelegate(Of T)) As Threading.Thread
      Dim act As New Worker(Of T)(Method, CallBack)
      Return New Threading.Thread(New Threading.ParameterizedThreadStart(AddressOf act.Invoke))
     End Function
     
     Private Class Worker(Of T)
      Private _Method As MethodDelegate(Of T)
      Private _CallBack As CallbackDelegate(Of T)
      Public Sub New(ByVal Method As MethodDelegate(Of T), ByVal CallBack As CallbackDelegate(Of T))
       _Method = Method
       _CallBack = CallBack
      End Sub
      Public Sub Invoke()
       Dim Ret As T = _Method()
       If _CallBack IsNot Nothing Then
        _CallBack(Ret)
       End If
      End Sub
     End Class
    End Class
違反を報告
引用返信
■33673 / ResNo.5)  Re[4]: Threading.Threadで戻り値を取得したい
□投稿者/ 魔界の仮面弁士 大御所(1080回)-(2017/08/31(Thu) 18:08:47)
  • アイコンNo33672に追記(魔界の仮面弁士の記事)
    > 9.0 ということは、VB2008 をお使いでしょうか。
    > であればラムダ式を使わずに、AddressOf で記述してみてください。

    VB2005 / 2008 の場合は、Thread を直接扱うよりも、
    BackgroundWorker を使ったほうが楽かもしれません。

    VB2012 以降は Task で。
違反を報告
引用返信
■33674 / ResNo.6)  Re[4]: Threading.Threadで戻り値を取得したい
□投稿者/ ゆう 一般人(3回)-(2017/09/01(Fri) 09:43:34)
  • アイコンNo33672に返信(魔界の仮面弁士さんの記事)

    ありがとうございます

    Class Programの方も記述の仕方がわかりません
    お手数ですが教えてください
違反を報告
引用返信
■33676 / ResNo.7)  Re[5]: Threading.Threadで戻り値を取得したい
□投稿者/ 魔界の仮面弁士 大御所(1082回)-(2017/09/01(Fri) 11:23:42)
  • アイコンNo33674に返信(ゆうさんの記事)
    > Class Programの方も記述の仕方がわかりません

    先の案2 は、匿名メソッドや複数行ラムダの利用を前提としたヘルパークラスです。

    それらが使えない VB2008 から使おうとすると、受け渡し用のメソッドを
    個別に用意しなければならないので、むしろ二度手間になる気がします。

    最近のバージョンであれば、Task を使って簡単に書けるのですけれどね…。


    > お手数ですが教えてください

    変換の仕方は、ThreadBuilder の場合と同じです。

    ただ、 No33672 のコードは VB2008 以上で無いと動作しませんので、
    今回は VB2005 でも使える形に書き換えてみました。


    '--------------------------------------------------------
    'Module1.vb
    '--------------------------------------------------------
    Imports System.Threading
    Module Module1
      Sub Main()
        'ラムダ式が使えないので、受け渡し用のクラスを用意しなければならない。
        Dim wk As New Worker(1, 2)

        'スレッド生成
        Dim newThread As Thread = ThreadBuilder.NewThread(Of Integer)(AddressOf wk.Method, AddressOf wk.CallBack)

        'スレッド開始
        newThread.Start()

        'メインスレッドの処理

        'サブスレッドの完了待ち
        newThread.Join()
        Console.WriteLine(wk.ans)
        Console.ReadLine()
      End Sub

      Private Class Worker
        Private val1, val2 As Integer
        Public ans As Integer

        Public Sub New(ByVal val1 As Integer, ByVal val2 As Integer)
          Me.val1 = val1
          Me.val2 = val2
        End Sub

        ''' <summary>
        ''' 別スレッドに実行させたい処理
        ''' </summary>
        Friend Function Method() As Integer
          Return Me.val1 + Me.val2
        End Function

        ''' <summary>
        ''' スレッド完了後に戻り値をセットする処理
        ''' </summary>
        Friend Sub CallBack(ByVal returnValue As Integer)
          Me.ans = returnValue
        End Sub
      End Class
    End Module


    '--------------------------------------------------------
    'ThreadBuilder.vb
    '--------------------------------------------------------
    Imports System.Threading
    Public Class ThreadBuilder
      Public Delegate Function MethodDelegate(Of T)() As T
      Public Delegate Sub CallbackDelegate(Of T)(ByVal ReturnValue As T)

      Public Shared Function NewThread(Of T)(ByVal Method As MethodDelegate(Of T), ByVal CallBack As CallbackDelegate(Of T)) As Thread
        Dim act As New Worker(Of T)(Method, CallBack)
        Return New Thread(New Threading.ParameterizedThreadStart(AddressOf act.Invoke))
      End Function

      Private Class Worker(Of T)
        Private Method As MethodDelegate(Of T)
        Private Callback As CallbackDelegate(Of T)
        Public Sub New(ByVal Method As MethodDelegate(Of T))
          Me.New(Method, Nothing)
        End Sub
        Public Sub New(ByVal Method As MethodDelegate(Of T), ByVal CallBack As CallbackDelegate(Of T))
          Me.Method = Method
          Me.Callback = CallBack
        End Sub
        Public Sub Invoke(ByVal CallBack As Object)
          Dim cb As CallbackDelegate(Of T) = TryCast(CallBack, CallbackDelegate(Of T))
          If cb Is Nothing Then
            cb = Me.Callback
          End If
          Invoke(cb)
        End Sub
        Private Sub Invoke(ByVal CallBack As CallbackDelegate(Of T))
          Dim Ret As T = Method()
          If CallBack IsNot Nothing Then
            CallBack(Ret)
          End If
        End Sub
      End Class
    End Class





    ローカル変数ではなく、フィールド変数でも構わなければ、下記のように単純化することもできます。
    どの変数をどのスレッドが利用するのかを把握している必要があるので、

    'Module1.vb
    Imports System.Threading
    Module Module1
      Private val1 As Integer
      Private val2 As Integer

      Public Property ans() As Integer
        Get
          Return _ans
        End Get
        Private Set(ByVal value As Integer)
          _ans = value
        End Set
      End Property
      Private _ans As Integer

      Sub Main()
        val1 = 1
        val2 = 2
        ans = 0

        'スレッド生成
        Dim newThread As Thread = ThreadBuilder.NewThread(Of Integer)(AddressOf Method, AddressOf CallBack)

        'スレッド開始
        newThread.Start()

        'メインスレッドの処理

        'サブスレッドの完了待ち
        newThread.Join()
        Console.WriteLine(ans)
        Console.ReadLine()
      End Sub

      ''' <summary>
      ''' 別スレッドに実行させたい処理
      ''' </summary>
      Private Function Method() As Integer
        Return val1 + val2
      End Function

      ''' <summary>
      ''' スレッド完了後に戻り値をセットする処理
      ''' </summary>
      Friend Sub CallBack(ByVal returnValue As Integer)
        ans = returnValue
      End Sub
    End Module
違反を報告
引用返信
■33677 / ResNo.8)  Re[6]: Threading.Threadで戻り値を取得したい
□投稿者/ ゆう 一般人(4回)-(2017/09/01(Fri) 16:12:22)
  • アイコンありがとうございました

    期待どおりの結果が得られました
解決済み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-8]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■33661 / 親記事)  POSTとブラウザで動きが違うのはなぜでしょう?
□投稿者/ ヤナ 一般人(1回)-(2017/08/17(Thu) 18:11:52)
  • アイコン環境/言語:[vb.net .NET Framework4.7.0] 
    分類:[.NET] 

    いつもこちらのサイトにはお世話になっております。

    ご質問です。

    下記「POSTでデータを送信する」の内容を参考にして、自分のサイトのお問い合わせフォームに、
    POSTを送信しました。
    https://dobon.net/vb/dotnet/internet/webrequestpost.html

    googleのrecaptchaを設置してあるページでして、あえてrecaptchaのチェックボックスはオフのまま(というかチェックをプログラムでONにする方法はわからないので)POSTしました。

    上記のお問い合わせフォームに、普通にブラウザで手動で行うと、recaptchaの認証エラーで「あなたがロボットではないことを証明してください。」と返ってきます。

    しかしプログラムでPOSTしますと、返ってきたhtmlの中には、
    「あなたがロボットではないことを証明してください。」は含まれていませんでした。

    これはどうしてでしょうか?

    同じようにrecaptchaの認証エラーが返ってほしいのです。

    input type="submit" というタグが含まれていますが、これを明示的にクリックするような処理が必要なのかな?などと思うのですが、よくわかりません。

    的外れな質問でしたら申し訳ありません。

    VSは2017で、.NET Frameworkは4.7.0です。

    宜しくお願い致します。
違反を報告
引用返信

▽[全レス6件(ResNo.2-6 表示)]
■33663 / ResNo.2)  Re[2]: POSTとブラウザで動きが違うのはなぜでしょう?
□投稿者/ ヤナ 一般人(2回)-(2017/08/17(Thu) 21:49:27)
  • アイコン魔界の仮面弁士様、お返事ありがとうございます。
    取り急ぎ、一部ご返答します。

    > POST 元のページに reCHAPTCHA が設置されているのでしょうか。
    > POST 先のページで reCHAPTCHA が利用されているのでしょうか。

    こちらのページになります。
    https://enjoyrose.net/otoiawase

    名前やメールアドレス、題名、本文を入力したものとして、POSTしています。
    なので、POST元もPOST先も同じページになります。

    > reCAPTCHA 自体は JavaScript 実装ですよね。

    自サイトはワードプレスでして、reCAPTCHAはプラグインでの実装です。
    APIキーをセットして使っていて、
    htmlのソースは次のようになっていました。この部分だけですとJavaScriptではないようです。

    <p>認証</p>
    <div class="wpcf7-form-control-wrap"><div data-sitekey="6Lc07hAUAAAAAG98c3Ey-p2LKSGjXuRdVAVNtBKo" class="wpcf7-form-control g-recaptcha wpcf7-recaptcha"></div>
    <noscript>
    <div style="width: 302px; height: 422px;">
    <div style="width: 302px; height: 422px; position: relative;">
    <div style="width: 302px; height: 422px; position: absolute;">
    <iframe src="https://www.google.com/recaptcha/api/fallback?k=6Lc07hAUAAAAAG98c3Ey-p2LKSGjXuRdVAVNtBKo" frameborder="0" scrolling="no" style="width: 302px; height:422px; border-style: none;">
    </iframe>
    </div>
    <div style="width: 300px; height: 60px; border-style: none; bottom: 12px; left: 25px; margin: 0px; padding: 0px; right: 25px; background: #f9f9f9; border: 1px solid #c1c1c1; border-radius: 3px;">
    <textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="width: 250px; height: 40px; border: 1px solid #c1c1c1; margin: 10px 25px; padding: 0px; resize: none;">
    </textarea>
    </div>
    </div>
    </div>
    </noscript>

    > WebRequst は HTTP リクエストを投げ、その応答を受け取るだけで、
    > 受信したデータ(HTML、JavaScript、Image 等)を解析する機能は
    > ありませんが、そういう意味ではなく?

    はい、解析は受け取ったhtmlをエディタソフトに貼り付け、中身を確認しています。

    > いずれにせよ、ブラウザーから正しく呼び出した場合と、
    > コードから呼び出した場合とで、リクエストの内容に
    > どのような差異があるのか、Fiddler 等で比較してみては如何でしょう。

    そうですね、ありがとうございます。基本ですよね、すみません(^_^;)
    明日、早速確認してみます。

    宜しくお願い致します。

違反を報告
引用返信
■33664 / ResNo.3)  Re[3]: POSTとブラウザで動きが違うのはなぜでしょう?
□投稿者/ 魔界の仮面弁士 大御所(1076回)-(2017/08/18(Fri) 15:03:14)
  • アイコンNo33663に返信(ヤナさんの記事)
    > こちらのページになります。
    > https://enjoyrose.net/otoiawase

    ページの最後の方に
     <script type='text/javascript' src='https://www.google.com/recaptcha/api.js?onload=recaptchaCallback&#038;render=explicit'></script>
    がありますよね。これにより
     https://www.gstatic.com/recaptcha/api2/r20170808164053/recaptcha__ja.js
    を同期ロードするための <script> タグが動的に生成され、
    これによって reCAPTCHA が実行されるようです。
    もちろん WebRequest クラスで読み込んだ場合は動作しませんが。


    > htmlのソースは次のようになっていました。この部分だけですとJavaScriptではないようです。

    reCAPTCHA にはスクリプト無しで認証させるモードがあったと思いますし、
    JavaScript が無効な場合においては、提示いただいた <iframe> が読み込まれるわけですが、
    そもそも WebRequest は、iframe を自動ロードしませんね。

    なお、試しに JavaScript を無効にして実行してみましたが、今回の iframe 内には
    『JavaScript を有効にして reCAPTCHA による確認を行ってください。』
    という案内が表示されるのみであり、認証処理は動作しませんでした。


    > 「あなたがロボットではないことを証明してください。」は含まれていませんでした。

    実際に投稿していないので未確認ですが、このメッセージも、
    json 等を通じて動的にレンダリングされるものだったりはしませんか?
違反を報告
引用返信
■33665 / ResNo.4)  Re[3]: POSTとブラウザで動きが違うのはなぜでしょう?
□投稿者/ 魔界の仮面弁士 大御所(1077回)-(2017/08/18(Fri) 15:47:24)
  • アイコン2017/08/18(Fri) 16:02:22 編集(投稿者)

    No33663に返信(ヤナさんの記事)
    > こちらのページになります。
    > https://enjoyrose.net/otoiawase

    ちなみに IE で開いた場合、
     <form action="/otoiawase#wpcf7-f73-p74-o1" method="post" class="wpcf7-form" novalidate="novalidate">
    の下に、スクリプトによって
     <textarea name="g-recaptcha-response" id="g-recaptcha-response">
    が動的に(非表示で)配置されていました。
    ここにユーザー応答がトークンとしてセットされるようです。
    ※ JavaScript が無効な場合は、<noscript> 側に同様の仕組みがあります。


    ページを表示した直後は、この textarea の中身は空でしたが、
    reCAPTCHA での認証が終わった段階で再確認すると、
    毎回異なる 356 桁の ASCII 文字列がセットされていました。

    技術資料としてはこのあたり。
    https://developers.google.com/recaptcha/docs/verify

    条件次第では、チェックすら要らないパターンもあるようです。
    https://blog.cles.jp/item/9210


    No33661に返信(ヤナさんの記事)
    > ご質問です。
    https://matome.naver.jp/odai/2139376092030703401


    > (というかチェックをプログラムでONにする方法はわからないので)POSTしました。
    まぁ、プログラムで認証を突破できないようにするための機能ですしね。
    タイミングや回数なども判断して、自動化できないよう認証手順を変えてきたりもしますし。

    ところで、POST する際には Request Body も必要なはずですが、
    その情報は正しくセットしていますか?

    reCAPTCHA 認証無しのページに対しても正しく送信できないようでは、
    > 同じようにrecaptchaの認証エラーが返ってほしいのです。
    の検証実験以前の問題という事になってしまいますし。



    > しかしプログラムでPOSTしますと、返ってきたhtmlの中には、
    > 「あなたがロボットではないことを証明してください。」は含まれていませんでした。

    reCAPTCHA 認証以外の箇所の送信内容に問題が無かったとして、
    それでも認証エラーの類が見当たらない、ということなのでしょうか?

    だとしたら、html の中にそのメッセージがずばり書いてある保証はないので、
    「認証エラーを検出する手順」に問題があるのだと思います。
    スクリプトの多くは難読化されているので、目視チェックも困難でしょうし。

    もしくは、そもそも認証の仕組みを正しく組み込めておらず、
    未認証でも機械的に受け入れてしまっている可能性もありますが、
    プラグインとして提供されているものなら、その可能性は低いでしょう。

    さもなくば、ロボットに対しては正常にお問い合わせを受け入れたように見せかけて、
    実際には不正なリクエストとして読み捨てているのかもしれませんが、
    いずれにしても詳しいことは分かりません。
違反を報告
引用返信
■33666 / ResNo.5)  Re[4]: POSTとブラウザで動きが違うのはなぜでしょう?
□投稿者/ ゴア教授 一般人(1回)-(2017/08/18(Fri) 15:47:28)
  • アイコンやりたいことが分からないのですが、

    ・このサイトにプログラムから投稿したいのか?
    ・プログラム投稿で認証エラーが出て欲しいのは何故なのか?

    もし、今回の質問の意図が「ロボットアクセスしたい」
    というものである場合、様々な問題に抵触する恐れがあるため、
    回答はつかないと思います。

    その点を明確にしてもらえるでしょうか?
違反を報告
引用返信
■33667 / ResNo.6)  Re[4]: POSTとブラウザで動きが違うのはなぜでしょう?
□投稿者/ ヤナ 一般人(3回)-(2017/08/18(Fri) 17:58:07)
  • アイコンお世話になっております。
    魔界の仮面弁士様、詳しく検証して頂きありがとうございます。

    まず、fiddlerにて検証した結果ですが、ブラウザから送信ボタンをクリックした場合は、
    POST https://enjoyrose.net/wp-json/contact-form-7/v1/contact-forms/73/feedback HTTP/1.1
    へPOSTしていました。

    https://enjoyrose.net/otoiawase で送信ボタンをクリックしていますので、
    てっきりhttps://enjoyrose.net/otoiawaseへPOSTすれば良いかと思っていたのですが、プラグインの動作ではURLが違っていました。

    申し訳ありませんm(_ _)m


    > ページの最後の方に
    >  <script type='text/javascript' src='https://www.google.com/recaptcha/api.js?onload=recaptchaCallback&#038;render=explicit'></script>
    > がありますよね。これにより
    >  https://www.gstatic.com/recaptcha/api2/r20170808164053/recaptcha__ja.js
    > を同期ロードするための <script> タグが動的に生成され、これによって reCAPTCHA が実行されるようです。
    > もちろん WebRequest クラスで読み込んだ場合は動作しませんが。

    > reCAPTCHA にはスクリプト無しで認証させるモードがあったと思いますし、
    > JavaScript が無効な場合においては、提示いただいた <iframe> が読み込まれるわけですが、
    > そもそも WebRequest は、iframe を自動ロードしませんね。

    承知しました。ありがとうございます。
    よくわかっておらず、すみません。

    > 実際に投稿していないので未確認ですが、このメッセージも、
    > json 等を通じて動的にレンダリングされるものだったりはしませんか?

    どうもそのように思います。これもプラグインが表示させているようです。

    >  <textarea name="g-recaptcha-response" id="g-recaptcha-response">
    > が動的に(非表示で)配置されていました。
    > ここにユーザー応答がトークンとしてセットされるようです。

    > ページを表示した直後は、この textarea の中身は空でしたが、
    > reCAPTCHA での認証が終わった段階で再確認すると、
    > 毎回異なる 356 桁の ASCII 文字列がセットされていました。

    ありがとうございます。
    認証されたら、暗号のような文字列がセットされるところですね。

    > ところで、POST する際には Request Body も必要なはずですが、
    > その情報は正しくセットしていますか?

    はい、ボディ部には、入力欄に入力するつもりの値をセットしています。
    名前やメールアドレス、題名、本文などのことですよね。

    > reCAPTCHA 認証以外の箇所の送信内容に問題が無かったとして、
    > それでも認証エラーの類が見当たらない、ということなのでしょうか?
    > だとしたら、html の中にそのメッセージがずばり書いてある保証はないので、

    はい、どうやらそのようです。返り値にセットされていると思いこんでいました。申し訳ありません。

    > もしくは、そもそも認証の仕組みを正しく組み込めておらず、
    > 未認証でも機械的に受け入れてしまっている可能性もありますが、
    > プラグインとして提供されているものなら、その可能性は低いでしょう。

    はい、こちらは大丈夫のようです。


    魔界の仮面弁士様、ゴア教授様、やりたいことは、ECサイトの買い物で、途中まで「ロボットアクセスしたい」ですが、googleの認証部分は人の手でクリアします。
    google認証を、PGで突破したいわけではありません。不可能でしょうし。

    その、人の手でクリアする部分ですが、そこを担当する外部サービスがありまして、それを利用する時にそのサービス先にPOSTで投げるのですが、その方法を検証するために、前後の動きを把握しようとしていました。


    ひとまず、上記にあげたサイトでは検証できないことがわかりました。
    ありがとうございますm(_ _)m


    引き続き検証していきますが、この質問のタイトルとは合いませんので、クローズします。そもそものPOST先が間違っていましたことと、プラグインが動作してメッセージを表示していたことで、PGから同じように動作させるのは難しいようでした。

    ありがとうございました。
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-6]



■記事リスト / ▲上のスレッド
■33655 / 親記事)  UIスレッド使用中のBeginInvoke
□投稿者/ あばば無人君 一般人(1回)-(2017/08/16(Wed) 10:08:00)
  • アイコン環境/言語:[Windows7(32bit)、C#、.NET Framework-4.0] 
    分類:[.NET] 

    初投稿です。宜しくお願いします。

    ・画面のスレッド(以後「UIスレッド」と記載)以外のスレッドから画面のコントロールにアクセスする場合、フォームなどのBeginInvoke関数で一時的にUIスレッドを使用してアクセスするのが基本かと思います。

    ・私は.NetフォームアプリケーションのUIスレッドは1つだけと認識しています。

    上記の前提で質問なのですが、UIスレッド以外に、たとえば別アプリからパケットを受信したらBeginInvoke関数で画面上のラベルに"受信しました。"というメッセージを表示するスレッド(以後「受信スレッド」と記載)があるフォームアプリケーションがあるとします。

    このアプリケーションでモーダルダイアログを表示中に受信スレッドが何らかのパケットを受信してメッセージを表示しようとしても、UIスレッドが使用中なので受信スレッドはダイアログが閉じられるまで固まったままだろうという認識は間違っているのでしょうか?

    上記の様なアプリケーションのソースを見ながら「こりゃ受信スレッドは固まるかな?」と思い動かしてみたところ、受信スレッドが固まらなかったので不思議です。
    UIスレッド使用中にBeginInvoke関数で画面上のコントロールにアクセスする時は一時的にUIスレッドが2つになるのでしょうか?

    宜しくお願い致します。

    ※お気楽掲示板に投稿していた物をこちらに移しました。(お気楽の方は削除済み)
違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■33656 / ResNo.1)  Re[1]: UIスレッド使用中のBeginInvoke
□投稿者/ 魔界の仮面弁士 大御所(1073回)-(2017/08/16(Wed) 11:21:04)
  • アイコンNo33655に返信(あばば無人君さんの記事)
    > ・画面のスレッド(以後「UIスレッド」と記載)以外のスレッドから画面のコントロールにアクセスする場合、
    > フォームなどのBeginInvoke関数で一時的にUIスレッドを使用してアクセスするのが基本かと思います。
    正確には System.Windows.Forms.Control クラスの
    BeginInvoke メソッド / Invoke メソッドですね。
    (このほか、デリゲート等にも BeginInvoke メソッドが存在します)

    また、BackgroundWorker とか SynchronizationContext とか ContinueWith など、
    Invoke / BeginInvoke 以外の手段も用意されています。


    > ・私は.NetフォームアプリケーションのUIスレッドは1つだけと認識しています。

    一つであることが多いですが、一つであるとは限りません。たとえば VB の場合、
    スタートアップ フォーム(My.Forms.Form1 など)が表示される UI スレッドと
    スプラッシュ スクリーン(My.Application.SplashScreen)が表示される UI スレッドは
    異なるスレッドとなります。



    > UIスレッド以外に、たとえば別アプリからパケットを受信したらBeginInvoke関数で画面上のラベルに"受信しました。"というメッセージを表示するスレッド(以後「受信スレッド」と記載)があるフォームアプリケーションがあるとします。
    この場合、受信データを保持しておく変数を、スレッド間で共有しない方が良いでしょうね。
    (変数を共有させると、読み出し中に書き込みが行われないような同期制御も必要になるため)


    > このアプリケーションでモーダルダイアログを表示中に受信スレッドが何らかのパケットを受信してメッセージを表示しようとしても、UIスレッドが使用中なので受信スレッドはダイアログが閉じられるまで固まったままだろうという認識は間違っているのでしょうか?

    モーダルダイアログの表示中だからと言って、UI スレッドが固まることはありません。

    ShowDialog メソッドは同期処理なので、ダイアログが閉じられる(≠破棄される)までの間
    呼び出し元に処理が戻されることはありませんが、その間もメッセージループは回り続けており、
    たとえば PictureBox_Paint や Timer_Tick などは、引き続き UI スレッドのコンテキストで呼び出されます。
違反を報告
引用返信
■33657 / ResNo.2)  Re[2]: UIスレッド使用中のBeginInvoke
□投稿者/ あばば無人君 一般人(2回)-(2017/08/16(Wed) 15:30:53)
  • アイコンNo33656に返信(魔界の仮面弁士さんの記事)

    ご回答、ありがとうございます。

    >>このアプリケーションでモーダルダイアログを表示中に受信スレッドが何らかのパケットを受信してメッセージを表示しようとしても、UIスレッドが使用中なので受信スレッドはダイアログが閉じられるまで固まったままだろうという認識は間違っているのでしょうか?
    >
    > モーダルダイアログの表示中だからと言って、UI スレッドが固まることはありません。
    >
    > ShowDialog メソッドは同期処理なので、ダイアログが閉じられる(≠破棄される)までの間
    > 呼び出し元に処理が戻されることはありませんが、その間もメッセージループは回り続けており、
    > たとえば PictureBox_Paint や Timer_Tick などは、引き続き UI スレッドのコンテキストで呼び出されます。

    UIスレッドが固まる事は無いとの事ですが、ご記載の通りモーダルダイアログは閉じられるまで呼出元に処理が戻らない事を考慮すると、UIスレッドの挙動がわからなくなりました。

    前述の通り私は.NetフォームアプリケーションのUIスレッドは基本的に1つの認識ですので、モーダルダイアログ表示中のUIスレッドはユーザーの操作(ダイアログの閉じや廃棄)を待っている状態だと思っておりますが、そもそもそれが間違いなのでしょうか?

    メッセージループが回り続けている==UIスレッドは空いていてコントロールへのアクセスも可能と考えるべきなのでしょうか?

    宜しくお願い致します。

    ※他3点に関する補足、ありがとうございました。

違反を報告
引用返信
■33658 / ResNo.3)  Re[3]: UIスレッド使用中のBeginInvoke
□投稿者/ Azulean 大御所(485回)-(2017/08/16(Wed) 16:14:28)
  • アイコン2017/08/16(Wed) 16:16:06 編集(投稿者)

    No33657に返信(あばば無人君さんの記事)
    > メッセージループが回り続けている==UIスレッドは空いていてコントロールへのアクセスも可能と考えるべきなのでしょうか?

    最近は隠蔽されてしまってあまり知られていないかもしれませんが、基本的に Windows アプリケーションは根っこにメッセージループを持っています。
    このメッセージループでマウスクリックなどのウィンドウメッセージを受けて、Form や Control のイベントハンドラを呼び出す流れを作っています。

    このメッセージループで次のウィンドウメッセージを待っている状態を、「UI スレッドが空いている」と表現して良いものです。


    > UIスレッドが固まる事は無いとの事ですが、ご記載の通りモーダルダイアログは閉じられるまで呼出元に処理が戻らない事を考慮すると、UIスレッドの挙動がわからなくなりました。

    ShowDialog によってモーダルダイアログを表示している場合、その ShowDialog の中でメッセージループが回っていると考えてください。
    (外側のメッセージループのイベントを受けて、ShowDialog した結果、内側でメッセージループを回すので、ループの中でループを回しているような状態)

    > 前述の通り私は.NetフォームアプリケーションのUIスレッドは基本的に1つの認識ですので、モーダルダイアログ表示中のUIスレッドはユーザーの操作(ダイアログの閉じや廃棄)を待っている状態だと思っておりますが、そもそもそれが間違いなのでしょうか?

    前述のように、モーダルダイアログを表示中も中でメッセージループが回るので、「間違い」と言えるでしょうね。

    仮に あばば無人君さん が言われるようにメッセージループではなく、ずっと待っている状態だと、Windows アプリケーションとしては「応答なし」となってしまい、クリックなどに反応できない仕様となっています。
違反を報告
引用返信
■33659 / ResNo.4)  Re[3]: UIスレッド使用中のBeginInvoke
□投稿者/ 魔界の仮面弁士 大御所(1074回)-(2017/08/16(Wed) 17:07:15)
  • アイコン2017/08/17(Thu) 09:22:38 編集(投稿者)

    No33657に返信(あばば無人君さんの記事)
    > ご記載の通りモーダルダイアログは閉じられるまで呼出元に処理が戻らない事を考慮すると、UIスレッドの挙動がわからなくなりました。

    たとえば下記の処理を見てください。
    FontDialog.ShowDialog によってモーダルダイアログを表示しています。


    private void button1_Click(object sender, EventArgs e)
    {
     using (var dlg = new FontDialog())
     {
      dlg.ShowApply = true;
      dlg.ShowColor = true;
      dlg.Color = label1.ForeColor;
      dlg.Font = label1.Font;
      dlg.Apply += delegate { SetLabelConfig(dlg.Font, dlg.Color); };
      if (dlg.ShowDialog() == DialogResult.OK)
      {
       SetLabelConfig(dlg.Font, dlg.Color);
      }
     }
    }

    void SetLabelConfig(Font newFont, Color newColor)
    {
     label1.Text = newFont.Name;
     label1.Font = newFont;
     label1.ForeColor = newColor;
    }


    このとき、ダイアログの[適用]ボタンが押されると、Apply イベントが呼び出されます。

    ダイアログが開いている間(ShowDialog から DialogResult が返される前)であっても、
    Apply イベントを通じて、UI スレッドのコンテキストで SetLabelConfig メソッドが
    処理されることになります。


    ちなみに、Application.Run が呼ばれると、その中でメッセージループが
    回されるようになっていますが、他にも ShowDialog メソッドや DoEvents メソッドが
    メッセージループを走らせるようになっています。

    http://bit.ly/2wPtNkA



    > 前述の通り私は.NetフォームアプリケーションのUIスレッドは基本的に1つの認識ですので、

    その認識で良いと思います。
    先の VB のような例外パターンもあるので、あくまでも「基本的には」ですが。



    > モーダルダイアログ表示中のUIスレッドはユーザーの操作(ダイアログの閉じや廃棄)を

    ユーザーの操作には、キーボード操作やマウス入力などがありますが、
    前回の回答でも述べた、「画面の再描画」や「タイマー通知」も含まれます。
    いずれもウィンドウメッセージによるものですね。

    今回のサンプルで言えば、『if (dlg.ShowDialog() == DialogResult.OK)』によって
    待機状態になるのは「Form1 上の button1_Click イベントハンドラ」だということです。

    モーダルダイアログの表示中は、呼び出し元の親画面(Form1)をユーザーが操作することは
    できませんが、ダイアログ表示中も、Form1 の Paint、FontDialog の Apply、
    Timer の Tick などのイベントは同じスレッド上で呼ばれますので、
    そうしたタイミングで「this.Left += 50;」などを呼び出せば、モーダルダイアログの
    表示中であっても、呼び出し元(Form1)のウィンドウの位置を変更することができます。


    > 待っている状態だと思っておりますが、

    待っているというよりは、何もしていない状態、の方が近いかも。

    いわゆるビジー状態(ループ処理や計算など、長い処理が行われている最中)においては、
    ウィンドウメッセージは処理されず、イベントも処理されません。再描画すらされません。

    しかし、何も処理されていない状態であれば、ウィンドウ メッセージを
    受け付けることができ、それが Control / Form によって、イベント等として
    処理されたり、画面に反映されたりします。


    > メッセージループが回り続けている==UIスレッドは空いていてコントロールへのアクセスも可能と考えるべきなのでしょうか?

    ワーカースレッドが無く、単一の UI スレッドのアプリであっても、ビジー状態の時に
    何か操作しようとすれば、処理が直ちに呼ばれず待たされたりします。
    (処理中の要求が後回しにされるのか間引かれるのかは、メッセージによって異なります)
違反を報告
引用返信
■33660 / ResNo.5)  Re[4]: UIスレッド使用中のBeginInvoke
□投稿者/ あばば無人君 一般人(3回)-(2017/08/17(Thu) 09:24:51)
  • アイコンAzuleanさん、魔界の仮面弁士さん、返信が遅くなり失礼致しました。
    お二人の投稿を読んで、自分のどこがいけなかったかようやく気付けました。

    モーダルダイアログを開いている時の状態と、ビジー状態(時間の掛かる処理)を、「同じ物」と認識していたのが最大の過ちでした。

    そこに気付いたら、モーダルダイアログが開いている状態でもメッセージループは動いていてUIへのアクセス(描画)が可能である事を違和感なく受け入れられました。

    最初の投稿で記載していた、モーダルダイアログ開き中に別スレッドからBeginInvokeを介してUIにアクセスできるのも納得できました。
    (UIスレッドは「空いている」という事ですからね)

    結局、当投稿のタイトル「UIスレッド使用中の」は、そもそも「使ってない」だろ!って話でした。恥ずかしい限りです。

    Azuleanさん
    > ShowDialog によってモーダルダイアログを表示している場合、その ShowDialog の中でメッセージループが回っていると考えてください。
    私が納得できるような考え方を示して頂きありがとうございました。

    魔界の仮面弁士さん
    具体的なサンプルや、
    > いわゆるビジー状態(ループ処理や計算など、長い処理が行われている最中)においては、
    > ウィンドウメッセージは処理されず、イベントも処理されません。再描画すらされません。
    >
    > しかし、何も処理されていない状態であれば、ウィンドウ メッセージを受け付けることができ、
    > それが Control / Form によって、イベント等として処理されたり、画面に反映されたりします。
    といった記載、目からうろこでした。ありがとうございました。

    自分の勘違いに気付けてすっきりしました。
    お二人とも、本当にありがとうございました。

解決済み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]






Mode/  Pass/

HOME HELP 新規作成 新着記事 ツリー表示 スレッド表示 トピック表示 発言ランク ファイル一覧 検索 過去ログ

- Child Tree -

2017/09/25(Mon) 19:53:22 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする