質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

Q&A

解決済

2回答

2467閲覧

WindowsフォームでPCカメラから読み込んだバーコードをWebブラウザの検索窓に入力し検索したい

tAkuy

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

0グッド

0クリップ

投稿2021/11/09 02:12

編集2021/11/09 07:35

前提・実現したいこと

初心者・初投稿です。
よろしくお願い致します。

複数人がが使用するsurface等のタブレットPCを前提としたバーコード(CODE 39)をカメラで読み取り、読み込んだ値をWebブラウザの検索窓に入力・Enterを実行し検索結果を表示するシステムをWebフォーム(C#)で製作中です。
なお、Webページはオリジナルでローカルネットワークサーバーで作成しており、起動時のページから検索後にページが遷移し検索窓のタグnameはページごとに二つ存在しています。

発生している問題・エラーメッセージ

backgroundWorker1_ProgressChangedイベント処理時に、
HtmlElementCollection all = webBrowser1.Document.All;
HtmlElementCollection forms = all.GetElementsByName("EnterNo");
forms[0].InnerText = scancode();
を行いたいのですが、直接backgroundWorker1_ProgressChangedイベントハンドラに入れてしまうと下記エラーが出てしまいうまくいきません。

System.NullReferenceException: 'Object reference not set to an instance of an object.'
"オブジェクト参照がオブジェクトインスタンスに設定されていません。"

System.Windows.Forms.WebBrowser.Document.get returned null.

エラー回避の為、webBrowser1_DocumentCompletedイベントハンドラに行いたい処理を入れてエラーは回避出来たのですが、backgroundWorker1_ProgressChangedイベントハンドラに呼び出すことができずにいます。

該当のソースコード

C#

1 2using System; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11using System.IO; 12using OpenCvSharp; 13using OpenCvSharp.Extensions; 14using ZXing; 15 16namespace Barcode_Reader_formapp 17 { 18 public partial class Form1 : Form 19 { 20 int WIDTH = 320; 21 int HEIGHT = 240; 22 Mat frame; 23 VideoCapture capture; 24 Bitmap bmp; 25 Graphics graphic; 26 BarcodeReader reader; 27 string prevData; 28 public Form1() 29 { 30 InitializeComponent(); 31 32 //カメラ画像取得用のVideoCapture作成 33 capture = new VideoCapture(0); 34 if (!capture.IsOpened()) 35 { 36 MessageBox.Show("camera was not found!"); 37 Close(); 38 throw new Exception(); 39 } 40 capture.FrameWidth = WIDTH; 41 capture.FrameHeight = HEIGHT; 42 43 //取得先のMat作成 44 frame = new Mat(HEIGHT, WIDTH, MatType.CV_8UC3); 45 46 //表示用のBitmap作成 47 bmp = new Bitmap(frame.Cols, frame.Rows, (int)frame.Step(), System.Drawing.Imaging.PixelFormat.Format24bppRgb, frame.Data); 48 49 //PictureBoxを出力サイズに合わせる 50 pictureBox1.Width = frame.Cols; 51 pictureBox1.Height = frame.Rows; 52 53 //描画用のGraphics作成 54 graphic = pictureBox1.CreateGraphics(); 55 56 //画像取得スレッド開始 57 backgroundWorker1.RunWorkerAsync(); 58 59 //バーコードリーダーのインスタンスを作成 60 reader = new BarcodeReader(); 61 } 62 private void Form1_Load(object sender, EventArgs e) 63 { 64 webBrowser1.ScriptErrorsSuppressed = true; 65 webBrowser1.Navigate("http://hoge/Search"); 66 } 67 68 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 69 { 70 BackgroundWorker bw = (BackgroundWorker)sender; 71 72 while (!backgroundWorker1.CancellationPending) 73 { 74 //画像取得 75 capture.Grab(); 76OpenCvSharp.Internal.NativeMethods.videoio_VideoCapture_operatorRightShift_Mat(capture.CvPtr, frame.CvPtr); 77 bw.ReportProgress(0); 78 } 79 } 80 81 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 82 { 83 //描画 84 graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows); 85 String text = scancode(); 86      //Save(text); //参考にしたプログラムの元のコード 87 88 } 89 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 90 { 91 //スレッドの終了を待機 92 backgroundWorker1.CancelAsync(); 93 while (backgroundWorker1.IsBusy) 94 Application.DoEvents(); 95 } 96 97 /// <summary> 98 /// バーコードの解析 99 /// </summary> 100 private String scancode() 101 { 102 String text = null; 103 Result result = reader.Decode(frame.ToBitmap()); 104 if (result != null && prevData != result.Text) 105 { 106 text = result.Text; 107 prevData = text; 108 } 109 return text; 110 } 111 //参考にしたプログラムの元のコード 112    /*///<summary> 113 ///データの保存 114 ///</summary> 115 ///<param name="text"> 116 ///</param> 117 private void Save(String text) 118 { 119 if (text == null) 120 { 121 return; 122 } 123 String userProfilePath = Environment.GetEnvironmentVariable("userprofile"); 124 String logPath = @"\Desktop\log.txt"; 125 File.AppendAllText(userProfilePath + logPath, text + Environment.NewLine); 126 //メモを開く 127 System.Diagnostics.Process.Start("notepad.exe", userProfilePath + logPath); 128 }*/ 129 130 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 131 { 132         try 133 { 134 HtmlElementCollection all = webBrowser1.Document.All; 135 HtmlElementCollection forms = all.GetElementsByName("EnterNo"); 136 forms[0].InnerText = scancode(); 137 } 138 catch 139 { 140 HtmlElementCollection all = webBrowser1.Document.All; 141 HtmlElementCollection forms1 = all.GetElementsByName("Search"); 142 forms1[0].InnerText = scancode(); 143 } 144 } 145 } 146}

参考にした元のプログラムは読み込んだバーコードを新規作成したメモ帳に入力・改行するものでした。
そのコードを参考にメモ帳ではなく検索窓に入力する方向にできないかと考え上記コードになりました。

参考資料:
https://belltree.life/windows-qr-code/
https://atmarkit.itmedia.co.jp/ait/articles/1803/14/news020.html
https://qiita.com/miwazawa/items/50cf5b913b058f59daa6
https://atmarkit.itmedia.co.jp/ait/articles/0904/02/news116.html
https://atmarkit.itmedia.co.jp/fdotnet/csharp_abc/csharp_abc_013/csharp_abc02.html

試したこと

backgroundWorker1_ProgressChangedに直接行いたい処理を入れ
Task.Delay(200).Wait():などの待機時間を入れて時間を何種類か変更して行いましたが、上記エラーが発生してしまします。

また、backgroundWorker1_ProgressChangedイベントハンドラにwebBrowser1_DocumentCompletedイベントハンドラを呼び出そうと以下の例の方法で行いましたが、HtmlElementCollection all = webBrowser1.Document.AllがwebBrowser1_DocumentCompletedイベントハンドラ内にないと上記のDocument.get nullのエラーが起きてしまいます。

private void button1_MouseMove(object sender, MouseEventArgs e) { mouseMove(); } private void test() { mouseMove(); } private void mouseMove() { MessageBox.Show("Hey"); }

他のイベントハンドラに別のイベントハンドラを呼ぶ方法で解決するか、他の可能性としては、webBrowser1_DocumentCompletedイベントハンドラに代わるイベントハンドラではない処理方法を見つけるか、プログラムの組み方を改めて見直すかかと考えています。
未熟な故、長文かつ要領を得ないところもあると思いますがご教授いただければと思います。
よろしくお願い致します。

補足情報(FW/ツールのバージョンなど)

PC:Windows10 Version 20H2
開発環境:Visual Studio Professional 2019 Version 16.11.5
開発フレームワーク・ツール:.NETFramework,Version=v4.7.2, Windows Forms

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2021/11/09 05:02

現状のご説明では処理の流れが良く分からないのが正直なところなのですが、backgroundWorker1_ProgressChangedで 逐次にwebBrowser1.Document.All; で読み込んだDocument内容を取り出そうするのも無理があるのでは? Document.Allで完全に読み出せるようになるのは、ブラウザコントロールでDocumentCompletedイベントが完了してからなのではないでしょうか。それに、なんとなくscancodeとやらはバーコードを読み出した結果を取り出すメソッドっぽいですが、画像から読み出しているような感じのコードに見えます。そういうものなのでしょうか。バーコードリーダーと言えば大抵はキーボード入力のようにテキストで直接読み出せたりするものですが。 コードの全貌は理解できませんが、かなり無理をしてバーコードを読み出そうとしているように感じます。
tAkuy

2021/11/09 07:16

ご指摘ありがとうございます。 参考にしたプログラムがbackgroundWorker1_ProgressChangedに下記Save(text)を実行してメモ帳を新規作成し、scancodeの値を入力・改行しているものでした。 ‘‘‘C# ///<summary> ///データの保存 ///</summary> ///<param name="text"> ///</param> private void Save(String text) { if (text == null) { return; } String userProfilePath = Environment.GetEnvironmentVariable("userprofile"); String logPath = @"\Desktop\log.txt"; File.AppendAllText(userProfilePath + logPath, text + Environment.NewLine); //メモを開く System.Diagnostics.Process.Start("notepad.exe", userProfilePath + logPath); } ‘‘‘ その動作を検索窓に入力できないかと考え投稿したコードになりました。 >>backgroundWorker1_ProgressChangedで >>逐次にwebBrowser1.Document.All; で読み込んだDocument内容を取り出そうするのも無理がある>>のでは? やはりプログラムの設計自体に無理があるのでしょうか。 設計から見直しになると今の自分のスキルでは難しそうです。 何かいい提案はございませんか。 >>バーコードリーダーと言えば大抵はキーボード入力のようにテキストで直接読み出せたりするものです>>が。 最初は、直接入力するプログラムを考えていたのですが、SendKeys.Send(scancode)でキーボード操作で直接入力を試みたのですが、うまくいきませんでした。 もう一度SendKeysでの実装を試してみます。 先にお話させて頂いた、おおもとのプログラムをコメントアウトの状態でコードに追加するのと動作説明を追記したいと思います。 SendKeys実装版についても検証後に更新させて頂きたいと思います。
dodox86

2021/11/09 07:31 編集

BackgroundWorkerとはC#/.NET Frameworkの古くからあるSystem.ComponentModel.BackgroundWorker クラスのことだと思いますが、 https://docs.microsoft.com/ja-jp/dotnet/api/system.componentmodel.backgroundworker?view=netframework-4.8 使っていけない訳ではないものの、これを使用すること自体、古いやり方なのです。今ではほかに推奨されるやり方がたくさんあります。 > 参考にしたプログラムがbackgroundWorker1_ProgressChangedに下記Save(text)を実行してメモ帳を新規作成し、 たぶん、とても古い、15年くらい前の参考記事なのでは? まぁ、それよりもブラウザコントロールを使うという方法もちょっと謎です。 > 最初は、直接入力するプログラムを考えていたのですが、SendKeys.Send(scancode)でキーボード操作で直接入力を試み>> たのですが、うまくいきませんでした。 > もう一度SendKeysでの実装を試してみます。 いや、SendKeysを使った方法は場合によってはまりますよ。ちゃんと目的のコントロールに入力フォーカスを当てるのが難しくなりがちです。 お使いのバーコードリーダーを正しく操作するSDKのようなものはないのでしょうか。それともバーコードを画像にしてそこから読み出すようなモジュールをお使いなのでしょうか。あくまで私の印象ですが、それぞれかなり綱渡り的な使い方をされているように見えます。
tAkuy

2021/11/09 08:02

なるほど、すべてが古い手法だったんですね。 実現したい動作に近く、元のプログラムは正常に動作したので、古いことは考えずそれを元にしていました。 今だとPCカメラからバーコードを読み込み検索窓に入力・Enterを実行させるにはどのような方法があるのでしょうか? 参考資料等あれば助かります。 >>いや、SendKeysを使った方法は場合によってはまりますよ。ちゃんと目的のコントロールに入力フォ>>ーカスを当てるのが難しくなりがちです。 それを聞いて思い出して来たんですが、ブラウザの検索窓にフォーカスを当てた状態でSendKeysを実装させたWindowsフォームでバーコード読み込み・フォーカスに値を入力を試みた際に、Windowsフォームにフォーカスがいってしまい検索窓に入力することができませんでした。 SendKeysを使用するは避けた方がいいでしょうか? >>お使いのバーコードリーダーを正しく操作するSDKのようなものはないのでしょうか。それともバー>>コードを画像にしてそこから読み出すようなモジュールをお使いなのでしょうか。あくまで私の印象で>>すが、それぞれかなり綱渡り的な使い方をされているように見えます。 Surface等のタブレットPCのアウトカメラを使用してバーコードを読み取る構想で考えています。 実現したいことを実装するのに何かいい方法をご存じではないでしょうか?
dodox86

2021/11/09 08:39

> なるほど、すべてが古い手法だったんですね。 混乱させたら申し訳ないですが、古い手法だとすべてダメ、とまでは言えません。充分に理解して使いこなして要望の動きを実現できるならそれでよいと思います。BackgroundWorkerに関しては今回に関してはそれを使ったから直接ダメという訳でもなさそうですし。 とりあえず、連携処理は置いておいて、ひとつひとつの処理はできているのでしょうか。 1. PCに搭載のカメラを使ってバーコードを撮影~CODE39の文字列で取得できる 2. 任意の文字列をWEBブラウザの検索窓またはWindowsForm上のWebBrowserコントロール上で表示しているHTML上の検索窓に出力できる 3. WEBブラウザ上の検索ボタンをプログラムから押す。(WEBブラウザではなく、WebBrowserコントロールからなら比較的簡単なはず)
tAkuy

2021/11/10 00:14

>1. PCに搭載のカメラを使ってバーコードを撮影~CODE39の文字列で取得できる scancodeの戻り値 textに文字列が取得できているのを元こーどのSaveメソッド実装で確認済みです。 >2. 任意の文字列をWEBブラウザの検索窓またはWindowsForm上のWebBrowserコントロール上で表示しているHTML上の検索窓に出力できる できていません。 WEB ブラウザの検索窓のケースではSendKeysのフォーカスがうまくいかず出来ておらず、WindowsForms上のWebBrowserコントロールでは先に述べさせてもらった通りbackgroundWorker1_ProgressChangedイベント時にwebBrowser1_DocumentCompletedイベント下のHtmlElementCollection all = webBrowser1.Document.Allを行う発想しか思いあたらず、出来ておりません。 >3. WEBブラウザ上の検索ボタンをプログラムから押す。(WEBブラウザではなく、WebBrowserコントロールからなら比較的簡単なはず) オリジナルWEBブラウザは検索ボタンを用意せずにEnterで実行する仕様にしているので、WEBブラウザ並びにWebBrowserコントロールでフォーカスの問題もありますがSendKeys.Send({Enter})で実行できるのではないかと思っています。
退会済みユーザー

退会済みユーザー

2021/11/10 00:47 編集

まず自分なりにデバッグ実行してイベントの発生順序や、どこでオブジェクトやプロパティがセットされるかを整理した方がいいです。かなり読みづらいコードだし、自分でも動作を把握していないコードを他人にデバッグさせる気ですか? NullReferenceExceptionが発生するというのは、本来そこでアクセスできる筈だったオブジェクトが存在しなかったということですよね。アクセスするまでの順序が間違ってるんじゃないですか? あと、ProgressChangedイベントはバックグラウンド処理の進行状況を表示するためのイベント(何%まで処理完了したとか)なので、そこでscancodeを呼び出しているのに非常に違和感があります。
tAkuy

2021/11/10 01:50

的確なご指摘ありがとうございます。 プログラミングを始めたばかりで、オブジェクト指向の思想もままならない状態あり、デバック方法もわかっていませんでした。 参考にしたコードを繋げれば実現したいことが実装できるくらいにしか考えが至っておらず、まったくプログラミングの基礎がなっていませんでした。 理解もせず、パズルを組み立てる感覚でコードを組み立てていたので、基礎から学習したいと思います。
dodox86

2021/11/10 01:56

> 理解もせず、パズルを組み立てる感覚でコードを組み立てていたので、 これは完全に取り組み方を間違っています。回答があっても理解できないことが往々にしてあります。(<そして、大抵、延々と質疑応答が続きます)まず、ひとつひとつの機能を理解して動くようにしてから連携させる必要があります。くっつける段階で別の問題が起きることも多いですが、ひとつひとつの機能(課題)が出来てから対応すべきことです。
dodox86

2021/11/10 02:02

> これは完全に取り組み方を間違っています。 あ、いえ、楽しみ方は人それぞれあるのでそういうやり方を全面的に否定するつもりはないですが、プログラマー、開発者としての態度では無いでしょう、ということです。
tAkuy

2021/11/10 02:30

> 理解もせず、パズルを組み立てる感覚でコードを組み立てていたので、 > これは完全に取り組み方を間違っています。 自分なりに調べて理解しようとしていたんですが、結果的に皆さんの指摘に理解が追いついていない状態なので理解もせず、パズルを組み立てる感覚でコードを組み立てていたという言い方にさせて頂きました。 >プログラマー、開発者としての態度では無いでしょう 肝に銘じます。 コードのひとつひとつの処理の確認なのですが、いかがだったでしょうか。 引き続きご教示頂けると幸いです。
dodox86

2021/11/11 03:42

> コードのひとつひとつの処理の確認なのですが、いかがだったでしょうか。 SendKeysを使った方法ですと(私では)フォローし切れないので、WebBrowserコントロールを使用した例で回答しました。そちらをご覧ください。
tAkuy

2021/11/11 09:05

ご回答ありがとうございます。 ここでのご指摘ありがとうございました。
guest

回答2

0

ベストアンサー

ご質問とそれに続くコメントでは、方針としてWindows FormsでWebBrowserコントロールを貼り付けた画面にSendKeysを使って入力やHTMLのボタン操作を行おうとするものですが、不可能とは言わないまでもSendKeysを使った方法はトラブルのもとです。表示しているウィンドウ画面や複数のコントロール、その他の外部アプリケーションが起動している状況でうまく目的のコントロールに要望通りのキーストロークを送るのは、場合により大変難しいものになります。私が質問のようなプログラムを作るとしたら、SendKeysを使うことはまずないです。

せっかくWebBrowserコントロールを自プログラム内で制御しているのですから、まずそれをうまく使うことを考えるべきでしょう。例として以下のようなHTMLがWEBサーバーでホスティングされているとします。入力欄であるcodeTextという名前のテキストボックスと、その入力値をサブミットするsubmitButtonという名前のボタンがあり、doActionのURLでGETメソッドでフォームを送信するものです。

html

1<!DOCTYPE html> 2<html> 3 <head /> 4 <body> 5 <div> 6 html form 7 </div> 8 <div> 9 <form action="doAction"> 10 <input type="text" name="codeText" /> 11 <input type="submit" name="submitButton" value="SUBMIT" /> 12 </form> 13 </div> 14 </body> 15</html>

対してこのHTMLを操作するWebBrowserコントロールを持つWindows FormsのC#サンプルプログラムです。

C#

1using System; 2using System.Windows.Forms; 3using System.Diagnostics; 4 5namespace WinFormApp1 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 14 // webBrowser1 のDocumentCompletedイベント 15 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 16 { 17 Debug.WriteLine("webBrowser1_DocumentCompleted()"); 18 button1.Enabled = true; 19 button2.Enabled = true; 20 button3.Enabled = true; 21 } 22 23 private void button1_Click(object sender, EventArgs e) 24 { 25 button1.Enabled = false; 26 button2.Enabled = false; 27 button3.Enabled = false; 28 29 // textBox1で指定したURLへアクセス 30 string url = textBox1.Text; 31 Debug.WriteLine($"url={url}"); 32 //webBrowser1.Refresh(); 33 webBrowser1.Navigate(url); 34 } 35 36 private void button2_Click(object sender, EventArgs e) 37 { 38 if (webBrowser1.Document != null && webBrowser1.Document.All != null) 39 { 40 // (1) HtmlElementを取得する方法その(1) 41 42 // HTML中のname="codeText"の要素に"12345"をセット 43 HtmlElementCollection elements = webBrowser1.Document.All.GetElementsByName("codeText"); 44 if (elements.Count > 0) 45 { 46 elements[0].InnerText = "12345"; 47 } 48 } 49 } 50 51 private void button3_Click(object sender, EventArgs e) 52 { 53 // (2) HtmlElementを取得する方法その(2) 54 HtmlElement element = webBrowser1.Document.GetElementById("submitButton"); 55 if (element != null) 56 { 57 element.InvokeMember("click"); 58 } 59 } 60 } 61}

このプログラムは、button1を押すとtextBox1に入力されたURLにNavigateメソッドでアクセスします。WebBrowserコントロールであるwebBrowser1DocumentCompleteイベントが発生したらHTMLドキュメントの読み込みが終わったことになります。button2を押すとWebBrowserコントロール中に表示されているHTMLのテキストボックスに"12345"を入力し、button3を押すとHTMLのサブミットボタンを押下します。SendKeysクラスを使ってキーボード押下をシミュレートする必要はありません。

ローカルPCでWEBサーバーを動作させ、動かしている様子が以下です。
イメージ説明
尚、WebBrowserコントロールはInternet Explorerのコンポーネントを使ったものであり、現在ではそれではなくWebView2の使用が推奨されています。私自身、今回久しぶりにWebBrowserコントロールを使ってみたもののInternet Explorerの設定にひきずられることが多く、使いづらく感じることも多かったです。WebView2については本回答では触れませんので、詳しくは別途あたってみてください。


Navigateメソッドでのフォームの送信について追記:

当初のご質問内容がWebBrowserコントロールを使ったものであり、表示中のHTMLの検索ボタンらしきものを押下したいという要望から回答したものでしたが、読み出したバーコード、あるいは何かしらの値で検索をしたいということはその検索用のURLに(おそらくはGETメソッドで)アクセスしたいということなのでしょうから、WebBrowserコントロールを使っているのであれば、その検索用URLにフォームのパラメータ付きでNavigateメソッドを呼び出してしまえばボタンの押下操作すら必要なくなります。例えば

C#

1webBrowser1.Navigate("http://server/doAction?code=1234678");

のように扱います。この辺りの知識はHTTPやHTMLのもので補完してください。

投稿2021/11/11 03:19

編集2021/11/11 04:26
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tAkuy

2021/11/11 09:23

dodox86さん ご指摘とご回答ありがとうございました。 ご親切に動画まで用意して頂きとてもわかりやすかったです。 お陰様でSendKeysを使わずに出力された値を使っての検索が実行できました。 本当にありがとうございました。 一度は検索を実行し、検索結果を表示出来たのですが、2回目以降が検索されないので検証していきたいと思います。 また、質問した際にご指摘ご回答いただければ幸いです。 ご教授本当にありがとうございました。
dodox86

2021/11/11 09:33

> 一度は検索を実行し、検索結果を表示出来たのですが、2回目以降が検索されないので検証していきたいと思います。 この現象は私の方でも頻発しましたが、WebページのブラウズにあたってInternetExplorerのキャッシュが効いたままになっているようです。Navigateメソッドを実行してもサーバーにアクセスしない場合があります。(WEBサーバー側でアクセスログを見ていると分かります)その為、サンプルコードではNavigateメソッドの実行の前にRefresh()を試してみようとした跡を残しています。(コメント化しています) キャッシュが残ったままの場合、Internet Explorerのキャッシュを削除する(コントロールパネルの「インターネットオプション」アプレットで操作)と改善することがありますが、決定的でもありませんでした。これはWebBrowserコントロールを使った場合の既知の問題と私は認識しています。過去のWEBの記事でもこれで困っている方々を散見します。WEBサーバー側から返すHTTPレスポンスやHTMLを工夫することで改善することもあります。
dodox86

2021/11/11 09:42

追加情報ですが、 > WebページのブラウズにあたってInternetExplorerのキャッシュが効いたままになっているようです。 困ったことにWEBサーバーを停止していてもブラウズが成功してしまう時もありました。こうなると「2回目以降検索しない」どころではありません。今回はこちらでは検証していませんが、GETメソッドでフォームの送信をするのではなくPOSTを使うようにしたり、HTTPリクエストのヘッダーを工夫することで改善することもあります。こうなるとHTTPクライアントとHTTPサーバーのお話になりますね。
tAkuy

2021/11/12 06:59

WebBrowserコントロールの検索窓に手打ちで対象数値を入力しEnterキーを押す分には何度行っても問題ないのでキャッシュやHTTPリクエストの問題ではなくProgressChanedイベントハンドラと画像取得のところに問題があるのではないかと思ってました。 キャッシュ並びにHTTPリクエストについて検証していきたいと思います。 お忙しい中、色々なパターンの検証をして頂きありがとうございます。
dodox86

2021/11/12 07:15

> ProgressChanedイベントハンドラと画像取得のところに問題があるのではないか いまだに正直、なぜProgressChangedイベントを監視する必要があるのか分からないのですが、それは置いておいて、サーバー側にリクエストが到達しているか確認するのは(前述しましたが)WEBサーバー側でアクセスログを見るのが有効な方法のひとつです。あと、何らかのパケットキャプチャーソフトを使うとか。 HTMLのボタンをENTERキーを押した場合は必ず送信できているのであれば、私のサンプルコードを使っているとして、サンプルのelement.InvokeMember("click");のコードの部分が呼ばれていないとか、Navigateメソッドを使っているのであれば、やはりキャッシュのせいであるとか、いろいろ考えられます。
guest

0

Webカメラを利用してQRコードを読み込むWindowsアプリを作る | すずきライフ

WebBrowserコントロール内のテキストボックスに文字列をセットするには?[2.0、C#、VB]:.NET TIPS - @IT

この2つの記事を合体させたいわけですね。

現状はDocumentがnullだからエラーになってるんですよね?
つまりページが読み込まれる前に、ProgressChangedに来てしまっている。と

ならnullチェックするだけでは?

ほかの要素もnullになるかもしれないし、reader.Decodeも例外を出すことがあるようなので不完全ですがこんなイメージで。

cs

1private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 2{ 3 graphic.DrawImage(bmp, 0, 0, frame.Cols, frame.Rows); 4 5 if (webBrowser1.Document == null) return; // まだ読み込み中なら入れようがない 6 7 string text = scancode(); 8 if (string.IsNullOrEmpty(text)) return; // バーコードが写っていないとnull?Empty?例外?(私は知りません) 9 10 HtmlElementCollection all = webBrowser1.Document.All; 11 HtmlElementCollection forms = all.GetElementsByName("EnterNo"); 12 forms[0].InnerText = text; 13}

投稿2021/11/10 21:19

編集2023/07/29 08:16
TN8001

総合スコア9363

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tAkuy

2021/11/11 09:15

TN8001さんご回答ありがとうございます。 無事、検索窓に読み取ったバーコードの値を出力することが出来ました。 単純にwebBrowse.documentrがnullかどうか見ればよかったんですね。 自分ではその考えに至らなかったです。 また、質問した際にご回答いただければ幸いです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問