当前位置:编程学习 > C#/ASP.NET >>

|zyciis| 慕白兄以前教我的从网页调用WinFrom程序的例子,那个WinForm程序执行完后可不可以返回数据到那个页面呢

我现在在做发IC卡的程序
在网页中添加一个ID,然后发卡
http://topic.csdn.net/u/20071217/18/420dd1f2-6f17-4854-a08b-1480928c4ea8.html

这个时候我就用
ICCard:|1|sdf5465sd1f213sd               //前面的为用户户 后面的为验证MAC
传了一个用户ID过去
然后在客户端用程序给这个用户发一张VIP卡,并在客户端用WebService去更新数据库
当发完VIP卡后,网页是没有改变的,这个时候就要手动的刷新一下才能从数据库中取得VIP的卡号
现在问:
1:那个程序执行完可不可以将我的VIP卡号填到网页中的txtVIPNO.Text中呢
2:如果1不行的话,能不能在Winform执行完的时候自动刷新那个页面呢
--------------------编程问答-------------------- mark
--------------------编程问答-------------------- 极其强烈的关注! --------------------编程问答-------------------- 另外, 能否把慕白兄以前教咱的从网页调用WinFrom程序的例子的地址发一下,我也想知道这个如何实现的 --------------------编程问答-------------------- 1.当然可以!不过自动的可能不行,你要在网页上加一个按钮,然后点击按钮用Javascript来读取winform里的值 --------------------编程问答-------------------- 这个可以在页面定时用ajax刷新

现在问: 
1:那个程序执行完可不可以将我的VIP卡号填到网页中的txtVIPNO.Text中呢 
2:如果1不行的话,能不能在Winform执行完的时候自动刷新那个页面呢 
这2种做法都是有难度的
方案1.你必须知道该ie的窗口句柄,然后取得ie的内容,更改ie的html
方案2.同样也要知道该ie的窗口句柄,然后发送命令来让ie刷新

具体的:你可以找找有关ie插件方面的资料

总体上说你的问题用异步的ajax就可以了,不需要动用那么麻烦技术 --------------------编程问答-------------------- 好复杂,基本没有遇见过这样的方式处理问题 --------------------编程问答-------------------- ^_^   up --------------------编程问答-------------------- 学习下 --------------------编程问答-------------------- 我现在是用XMLHTTP和数据库里面的一个操作字段有区分要更新页面的哪一个地方
但这样太麻烦了 ,要是能返回就好了

谢谢 --------------------编程问答-------------------- 要在winform中去捕获ie的窗口这比较困难.还有一个办法就是在winform中嵌入ie,这样可以做到交互。 --------------------编程问答-------------------- 如果用这种方法的话这里有篇文章。
http://www.jb51.net/html/200706/23/10455.htm --------------------编程问答-------------------- 开始走了变路,历时5个小时,终于解决了楼主的问题.

用ie打开aaa.html

运行 这个winform程序. 在winform的textbox里随便输入一串字符, 点击button, ie窗口中input id="t1" 的值被改为 winform中textbox的值.

增加引用dll:
mshtml
c:\windows\system32\SHDocVw.dll

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;
using mshtml;
namespace testWinIE
{
    public partial class Form1 : Form
    {
        /*[DllImport("user32.dll")]
        public static extern IntPtr FindWindow
            (string sClassName,
             string sWindowTitle);

        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowEx(
            IntPtr hParent,
            IntPtr hNext,
            string sClassName,
            string sWindowTitle);
        [DllImport("user32.dll")]
        public static extern int GetWindowTextLength(IntPtr hTxt);   // handle to window or control with text

        [DllImport("user32.dll")]
        public static extern int GetWindowText(IntPtr hWnd,        // handle to window or control with text
                    string lpString,  // address of buffer for text
                    int nMaxCount     // maximum number of characters to copy
                    );*/

        /*开始我试图使用调用api的方式来使用c# winform程序与ie窗口进行通信, 是成功了,可以控制ie窗口和标准windows控件,
         * 但是有个问题,控制不了文档区的元素,浪费了我好多时间。
         * 我们做windows程序知道,windows下面都是窗口,一个文本框 classname为 Edit,一个button,等等等等. 
         * 而在ie的文档区,它却不是,害我用了很多方法浪费时间,包括把16进制编号都用上了,就是查不到。
         * ie中的(准确地说,应该是web page中的htmlelement,比如input)它们不是标准windows控件
         * 最后查资料到ms,得到了微软件的实现方法,走了弯路,历时近5个小时,解决了这个问题.
         * fcuandy 2007-12-18
         */

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        public void test()
        {

            //IntPtr ieWin = FindWindow("IEFrame", "aaa - Microsoft Internet Explorer");
            //IntPtr txtPtr = IntPtr.Zero;
            //if (!ieWin.Equals(IntPtr.Zero))
            //{
              //  MessageBox.Show("window has been found");
                //txtPtr = FindWindowEx(ieWin, IntPtr.Zero, "IEFrame", null);
                //txtPtr = FindWindowEx(ieWin,IntPtr.Zero, "Shell DocObject View", "");
                //txtPtr = FindWindowEx(txtPtr,IntPtr.Zero , "Internet Explorer_Server", "");

                //if (!txtPtr.Equals(IntPtr.Zero))
                //{

                    /*
                     获得所有ie进程。因为windows下资源窗口使用ie内核,所以不光是我们通常指的web浏览器,它还包括你打开我的电脑这样的窗口
                     */
                    SHDocVw.ShellWindows sws = new SHDocVw.ShellWindows();
                    //SHDocVw.InternetExplorer iw = SHDocVw. new SHDocVw.InternetExplorer();

                    /*遍历ie进程*/
                    foreach (SHDocVw.InternetExplorer iw in sws)
                    {
                        //MessageBox.Show(iw.LocationName);

                        /*
                         如果使用的窗口中正打开的是我的aaa.html
                         * 我这里就没有对窗口类型进行检测了,因为我的aaa.html它一定是ie打开的。
                         */
                        if (iw.LocationName == "aaa.html")
                        {
                            //MessageBox.Show(iw.LocationName);
                            //HtmlDocument doc = iw.get (HtmlDocument)iw.Document;
                            //MessageBox.Show(doc.DomDocument.ToString());
                            mshtml.HTMLDocument doc = (mshtml.HTMLDocument)iw.Document;
                            
                            //MessageBox.Show(((HTMLInputTextElement)doc.getElementById("t1")).value);

                            //ihtmldocument2接口.可以查看msdn6. 做法有点类似于js对页面htmlelement操作了。
                            ((HTMLInputTextElement)doc.getElementById("t1")).value = textBox1.Text;
                        }
                    }
                    
                    
                    
                    //int txtLen = GetWindowTextLength(txtPtr);


                    //MessageBox.Show(winTxt);
                
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            test();
        }
    }

}



aaa.html

<html id="aa">
<title>aaa</title>
<body>
<input id="t1" name="txtTest" />
</body>
</html>
--------------------编程问答-------------------- 走了弯路,打错了.

回家吃饭了.楼主在使用这种方法时有问题可以post上来,大家一起参考.
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,