c# 如何获取另一个程序的窗体

_小黑_ 2013-08-12 10:10:08
如题,用户用我写的软件输入了一些值之后打开了另一个程序,这时用户点击我写的程序的导入把用户输入的数据导入到他已经打开的那个程序,这个功能如何实现啊,求高手解答
另外,另一个程序的页面上有上一页下一页等一些按钮,我如何获取这些按钮呢??
...全文
1549 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
_小黑_ 2013-08-16
  • 打赏
  • 举报
回复
yuxing117 2013-08-14
  • 打赏
  • 举报
回复
说说你的第一个问题,如果被调用的程序也可以由你来控制的话,那么可以在调用时传递参数来实现,如Process.Start("test.exe", "www"); 你的第二个问题就比较难控制了,想一想可以通过API来实现,或者通过第三方的媒介,比如说,调用程序发布指令后写到某处,然后被调用程序实时轮巡,如果发现相应指令,内部控制进行执行
_小黑_ 2013-08-14
  • 打赏
  • 举报
回复
求高手给个思路,谢啦,真心难住了
江湖评谈 2013-08-14
  • 打赏
  • 举报
回复
findwindows,enumchawindows,必要的时候可以用hook来获取都行。
_小黑_ 2013-08-14
  • 打赏
  • 举报
回复
卧_槽 2013-08-13
  • 打赏
  • 举报
回复
看一本书,好像叫windows程序设计
_小黑_ 2013-08-13
  • 打赏
  • 举报
回复
为什么没人啊???
_小黑_ 2013-08-13
  • 打赏
  • 举报
回复
有人做过类似的东西吗? 这个页面这么多textbox文本框,我已经定义好一个类,里面的属性都是IntPtr类型的用来存储这些textBox的句柄,我也已经知道FindWindowEx这个函数的第二个参数了, 我想实现的是 如何通过一个方法来给我定义的那些属性赋值。 下面是我获取一个textbox文本框的句柄并赋值

StringBuilder sb = new StringBuilder(255);
            IntPtr win = FindWindow(null, "xxxx管理软件");
            //CloseWindow(win);
            GetClassName(win, sb, 255);
            string className = sb.ToString().Substring(sb.ToString().IndexOf(".app"));
            string name = "1";

            IntPtr txt = FindWindowEx(win, IntPtr.Zero, "WindowsForms10.EDIT" + className, null);

            SendMessage(txt, WM_SETTEXT, IntPtr.Zero, name);
hzhangjun1103 2013-08-13
  • 打赏
  • 举报
回复
此贴不错,认真学习一下啊
_小黑_ 2013-08-13
  • 打赏
  • 举报
回复
引用 20 楼 lizhi3186575 的回复:
[quote=引用 19 楼 kingyaying 的回复:]
[quote=引用 13 楼 lizhi3186575 的回复:]
C#可以调用Win32中的FindWindow函数来获得打开窗口的句柄,具体函数的使用可以参考MSDN或者参考下面的文章:http://www.cnblogs.com/zhili/p/OnlyInstance.html

这篇文章很不错的样子[/quote]
希望对你有所帮助的[/quote]
页面是这样的
_小黑_ 2013-08-13
  • 打赏
  • 举报
回复
引用 17 楼 lizhi3186575 的回复:
[quote=引用 16 楼 l397870376 的回复:] [quote=引用 13 楼 lizhi3186575 的回复:] C#可以调用Win32中的FindWindow函数来获得打开窗口的句柄,具体函数的使用可以参考MSDN或者参考下面的文章:http://www.cnblogs.com/zhili/p/OnlyInstance.html
看了半天那个api函数不太懂啊,能找到窗体了,但是如何找到窗体上的textbox和按钮呢[/quote] 每一个控件在窗体上都被认为是一个子窗体 获取到窗体句柄之后 IntPtr hwnd = FindWindow(null, "你需要获取的窗体的标题,例如:Form1"); IntPtr ButtonHwnd= FindWindowEx(hwnd, IntPtr.Zero, "控件的名字", null); 这样就能得到控件的句柄 SendMessage(ButtonHwnd, WM_SETTEXT, IntPtr.Zero, name); 这样就能更改控件的内容了 具体参考: http://www.cnblogs.com/vvv999vz/archive/2011/08/03/2125895.html [/quote] 恩,已经大体实现功能了,但是遇到一个问题,就是那个窗体上的文本框很多,我已经定义好一个类来存储所有文本框的句柄了,但是我想写一个方法给定义这个类的属性赋值,不知道如何写?能给我个思路吗?
guoanjunatgmail 2013-08-12
  • 打赏
  • 举报
回复
spy++ findwindow
_小黑_ 2013-08-12
  • 打赏
  • 举报
回复
引用 8 楼 u011303459 的回复:
个人观点,仅供参考 情况1.如果客户程序中有textbox等控件存放输入数值,比较简单,只需修改你的程序 在导入的点击事件中使用api查找客户窗体,然后再查找textbox,还是利用api给客户程序textbox赋值。 情况2.如果客服程序没有textbox等控件存放输入数值,需要修改客户程序,而且麻烦 客户程序打开后,要先判断你的程序是否打开,如果打开,要使用钩子,监视鼠标点击和键盘回车事件,如果是点击[导入],那么就用api获取输入(类似情况1)
哥们这两中情况 都会出现,关键是我 如何获取句柄啊,我两用户那个程序的句柄名称都不知道,而且如何获取程序上面的按钮啊?
_小黑_ 2013-08-12
  • 打赏
  • 举报
回复
引用 7 楼 a312100321 的回复:
[quote=引用 5 楼 l397870376 的回复:] [quote=引用 4 楼 a312100321 的回复:] [quote=引用 2 楼 l397870376 的回复:] [quote=引用 1 楼 a312100321 的回复:] 轮询呗。实时监控。
不太理解啊,能详细说一下嘛[/quote] 如果A程序做了相应的操作,则把命令传送到B程序上。 在B程序上做个轮询(循环),实时接受命令。我现在就是这么解决我的教师端翻书,学生端跟着翻。希望能帮到你。[/quote] 你这是两个端口啊,你直接让学生端的屏幕显示你的不就行了嘛[/quote]是两个程序啊。 老师的机器是老师端,学生的机器是学生端,老师点控制的时候,才会控制学生端的操作。你说的直接显示,我没理解。。[/quote] 我的意思是 你 直接控制学生电脑的屏幕显示内容
Fly_ana_Sky 2013-08-12
  • 打赏
  • 举报
回复
采用窗体传值和委托的知识点: 我给你写几个代码你看看,在窗体Form1中的文本框中输入汉字,点击确定按钮,在Form2中的文本框中显示,然后在from2中的文本框中输入汉字,点击确定,让显示在Form1中的TextBox.Text中

namespace _02窗体传值
{
    public partial class Form1 : Form
    {
        public Form1(string st)
        {
            InitializeComponent();
            textBox1.Text = st;
        }
        public Form1()
        {
            InitializeComponent();
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 for2 = new Form2(textBox1.Text);
            for2.Show();


            Form1 for1 = new Form1(textBox1.Text);
            for1.Close();
 
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}
下面是Form2窗体的代码
namespace _02窗体传值
{
    public partial class Form2 : Form
    {
        public Form2(string st)
        {
            InitializeComponent();
            textBox1.Text = st;
        }
       

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

        private void button1_Click(object sender, EventArgs e)
        {
          
            Form1 for1 = new Form1(textBox1.Text);
            for1.Show();
        }
    }
}
feiniao19830822 2013-08-12
  • 打赏
  • 举报
回复
个人观点,仅供参考 情况1.如果客户程序中有textbox等控件存放输入数值,比较简单,只需修改你的程序 在导入的点击事件中使用api查找客户窗体,然后再查找textbox,还是利用api给客户程序textbox赋值。 情况2.如果客服程序没有textbox等控件存放输入数值,需要修改客户程序,而且麻烦 客户程序打开后,要先判断你的程序是否打开,如果打开,要使用钩子,监视鼠标点击和键盘回车事件,如果是点击[导入],那么就用api获取输入(类似情况1)
燕雀之志 2013-08-12
  • 打赏
  • 举报
回复
引用 5 楼 l397870376 的回复:
[quote=引用 4 楼 a312100321 的回复:] [quote=引用 2 楼 l397870376 的回复:] [quote=引用 1 楼 a312100321 的回复:] 轮询呗。实时监控。
不太理解啊,能详细说一下嘛[/quote] 如果A程序做了相应的操作,则把命令传送到B程序上。 在B程序上做个轮询(循环),实时接受命令。我现在就是这么解决我的教师端翻书,学生端跟着翻。希望能帮到你。[/quote] 你这是两个端口啊,你直接让学生端的屏幕显示你的不就行了嘛[/quote]是两个程序啊。 老师的机器是老师端,学生的机器是学生端,老师点控制的时候,才会控制学生端的操作。你说的直接显示,我没理解。。
_小黑_ 2013-08-12
  • 打赏
  • 举报
回复
引用 3 楼 tcjiaan 的回复:
FindWindow
请问如何获取那个程序的句柄啊,让我感觉最难的是控制按钮
_小黑_ 2013-08-12
  • 打赏
  • 举报
回复
引用 4 楼 a312100321 的回复:
[quote=引用 2 楼 l397870376 的回复:] [quote=引用 1 楼 a312100321 的回复:] 轮询呗。实时监控。
不太理解啊,能详细说一下嘛[/quote] 如果A程序做了相应的操作,则把命令传送到B程序上。 在B程序上做个轮询(循环),实时接受命令。我现在就是这么解决我的教师端翻书,学生端跟着翻。希望能帮到你。[/quote] 你这是两个端口啊,你直接让学生端的屏幕显示你的不就行了嘛
人生导师 2013-08-12
  • 打赏
  • 举报
回复
引用 19 楼 kingyaying 的回复:
[quote=引用 13 楼 lizhi3186575 的回复:] C#可以调用Win32中的FindWindow函数来获得打开窗口的句柄,具体函数的使用可以参考MSDN或者参考下面的文章:http://www.cnblogs.com/zhili/p/OnlyInstance.html
这篇文章很不错的样子[/quote] 希望对你有所帮助的
加载更多回复(12)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧