Communication between Webbrowser control and C# - c#

Can a Webbrowser control communicate with the C# class that created it? Is there anyway to set up something like ExternalInterface that works in Flash? I'm trying to get the following code to write to the console in C# or call a method in C#.
HtmlElement button = webBrowser1.Document.CreateElement("div");
button.InnerHtml = #"<INPUT TYPE='Text'><P><INPUT TYPE='Submit' Value='Submit' onclick='console.log('Clicked');'>";
webBrowser1.Document.GetElementById("myID").AppendChild(button);

A pretty hacky way would be to communicate via current location.. Button click:
onclick="window.location.href='#clicked';"
Then handle webBrowser1_Navigated and check the Url property. Split out the message after the # and log it to the console or call the method.

Related

c# - button click not executing method while using SignalR

I have a web forms application that uses signalR. I want to execute a method on the click of a button but when I click the button nothing happens. My hub class is defined as follows:
I also use the method "generateStatistics" in the hub class:
Now my client code is supposed to run the generateStatistics method on the click of a button. Here is the button code:
And finally this is what my client code looks like:
So, when I click the button nothing happens or at least the method isn't running because my breakpoint is never hit in the generateStatistics method. I did a bit of client javascript debugging in IE and it seems as though the connection is being made properly but the button click handler just doesn't seem to do anything. I guessed that it might be because the button is an asp server control with the runat specified but I turned it to an input html control and it still didn't seem to work or run the method. If you are wondering what the purpose of me using signalr here is that in the generateStatistics method I update the client with progress messages which you can infer from the javascript created method addProgress.
When you use ASP.NET, the HTML element ID will be different than what you specify on the control.
Try to use this instead:
$('#<%= btnStart.ClientID %>').click(function () { ... });

Get alert content when alert is shown

I have an HTML page with this script:
<Script>
function Run()
{
alert("The Content Here");
return true;
}
</script>
<button onclick="Run();">I Want It Now</button>
Lets say that I opened this page with firefox or Chrome. And lets say that I clicked on the button "I Want It Now" and the page shows me the alert:
The Content Here
How can I insert the alert content into a string in my VB.NET project? I know that I can use the alert window handle to get the label handle and then extract (grab) the text of the alert, but I don't think that this is the best way to do it. Is there another way to pass (or get) information from the page (not from webbrowser control or by using webClient.DownloadString) into my VB.NET (or C#) project?
i don't this it will easy to use js without the webbrowser control by the way if you changed your mind and want to use a web browser control , you can do it like this :)
WebBrowser1.Document.GetElementById("NAME").InvokeMember("click");

C# webBroswer component override the window.print from javascript

I have a web application that does a bunch of things, and need to write a C# program to print a document that is generated by the system.
When a user clicks the print button on the web form (window.print()), it will print to a specific printer without popping up the print dialog box.
I tried webbrowser.print(), but it only prints the web interface without the pop up.
One of the things that I'm looking for is a way to handle a print job created by the website. I want the C# program to be able to remove the print dialog box and print directly to the printer.
Can anyone give me a hint as to how I can go about implementing this, or explain why (if) this isn't possible?
P.S. I cannot change anything in the web application. That is why I want to write a C# program to perform/manage this additional action.
you have a webbrowser control on the c# form? do this:
myBrowser.Document.GetElementById("ButtonId").InvokeMember("click");
it automatically click the button.
if the button does not have id, then you will need to use either its class or tag to identify that button. Search "click button automatically in webbrowser control".
Try injecting script inside the web page from C# code
Something similar to on some C# app button click . .
HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function printDocument() { window.print(); }";
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("printDocument");
or simply
webBrowser1.InvokeScript("eval", "window.print();");

Filling a HTML form with C#

I need help with connecting to a certain website via my username & password.
With WebClient I can fill the username field and the password field, but how do I invoke the click method of the button?
And How can I fill a specific textBox that doesn't have an ID?
I tried doing this with webBrowser, but every time I navigate I have to use a new function every time, which makes the work much harder.
Thanks.
What you're trying to do is wrong. If you want to Post some data to a web address (a URL), simply create a web form (a simple HTML form), fill it, and then send it. Just consider these notes:
Your HTML's form action should be the exact URL of the form you're imitating.
Your input controls should have the same name attribute value.
For more information, see Form Spoofing
Look at the web browser control and see if you can use that inside your windows form to perform the task that you are doing. Once you are satisfied with the results, you can make the web browser control invisible, and it'll work just like you do with web response and request calls.
View the source code and find the id of the button (say "Login").
Then use:
HtmlElement elem = webBrowser1.Document.GetElementById("Login");
if (elem != null)
elem.InvokeMember("click");

Trying to set/get a JavaScript variable in an ActiveX WebBrowser from C#

We have a windows application that contains an ActiveX WebBrowser control. As part of the regular operation of this application modifications are made to the pages that are displayed by the ActiveX WebBrowser control. Part of these modifications involve setting a JavaScript variable in a web page being loaded into the ActiveX WebBrowser.
We need to initialize this variable within C# (originally, VB6 code was initializing the value). The value of this variable is a COM-visible class object.
However, for simplicity we've reduced the problem to setting a string value. Our original page involves frames and the like but the same problems happens in a page like this:
<HTML>
<HEAD>
<TITLE>Test</TITLE>
<SCRIPT type="text/javascript">
var field = 'hello world';
</SCRIPT>
</HEAD>
<BODY>
<input type="button" value="See field" onclick="javascript:alert(field);"/>
</BODY>
</HTML>
We want to access the field variable and assign a value to it. In VB6 the code for this was pretty straightforward:
doc.Script.field = 'newValue'
However, in C# we've had to resort to other tricks, like this:
Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);
The point of the page is to test whether our variable was properly assigned by C#. Clicking on the button should yield whatever new value was injected by C#. So for example, clicking on the button in the page we get an alert showing: "newValue".
That works the first time, but it doesn't work if we reload the page. On subsequent calls we cannot set the value of the variable field.
Has anyone had any experience doing this type of operation before?
I think what you are looking for is the eval() method in Javascript. You can call it from C# like this:
webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});
This code will evaluate "1 + 2" and return "3". I would imagine that if you were to put in
InvokeScript("eval", new String[] {"varName = 3"})
you would get that variable assigned to 3 if it is globally visible in the file.
If you use the webBrowser control, you can assign a c# object to the
objectForScripting property
http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.objectforscripting.aspx
after that you can use window.external in your javascript to interact with your c# object from javascript
if you use an activeX version for some reason, you can pass javascript: urls to programmatically sets your variable, or you can syncronize your script using a webservice/ database/file or simply using the method you suggested.
These two articles helped us find a solution to our problem. They outline the basics of what one needs to know:
Microsoft Web Browser Automation using C#
Using MSHTML Advanced Hosting Interfaces
So we implemented a DocHostUIHandler interface and that allowed us to set a UIHandler, allowing us to reference the method from Javascript.
The usual method we use is to add a hidden text input box (the ASP.Net control version) on the page. That way you can easily set its value in the C# codebehind and read the value in client side JavaScript (and vice-versa, of course).

Categories