蓝客社区

游客 您好,登录 | 注册

致蓝客社区的会员们:
即日起,社区论坛部分技术交流版块启用身份验证机制,须符合该版块要求的技术标准才能进入,不便之处敬请见谅!
网络信息安全交流QQ群:187228、会员交流聊天QQ群:42417627
论坛 » .NET编程技术 » C# 操作其他窗体

C# 操作其他窗体

zcs独裁者积分等级:LV0 经验等级:Exp0
#1发表于 2014-03-04 15:22 回复:17 查看:14395

电脑里安装了一个应用程序A,这个程序有界面,单击可以直接运行。我现在想用过C#程序来运行它(程序A),并且能操作这个程序A的界面大小和位置。
我尝试用Process的Start方法打开这个程序A,并用Process Now_Process对象接收返回的Process对象:Process Now_Process=Process.Start("A");
然后调用API  SetWindowPos(Now_process.MainWindowHandle,  HWND_TOP, 0, 0, 800, 300, 2)设置窗口,但是不成功。Now_process.MainWindowHandle始终返回0,我用下列代码虽然不为0了,但是经测试句柄获取任然不正确
           ssHandle=Now_process.MainWindowHandle
           while (ssHandle== IntPtr.Zero)
            {
                Thread.Sleep(1);
                Now_Process = Process.GetProcessById(Now_Process.Id);
                ssHandle = Now_Process.MainWindowHandle;
            }
我开始采取单独获取窗口句柄,然后再调用SetWindowPos只有前几次成功了,后面几次返回值虽然为true,但是窗体并没有改变,
有谁知道这个是什么原因么?
怎样我才能实现这个功能?


@zcs独裁者 编辑于 2014-03-04 15:25


蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#2发表于 2014-03-06 21:57
你的showontaskbar是不是设置成false了?
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#3发表于 2014-03-08 07:17
其实,如何你想在C#里面实现Win32的调用可以这样
public class A
    {
        //调用Win32 API
        [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "MoveWindow")]
        public static extern bool MoveWindow(System.IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        //打开窗体方法,fileName是C++的窗体名称,包含路径
        public void OpenAndSetWindow(String fileName)
        {
            Process p = new Process();//新建进程
            p.StartInfo.FileName = fileName;//设置进程名字
            p.StartInfo.CreateNoWindow = true;
            p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
            p.Start();
            MoveWindow(p.MainWindowHandle, 200, 300, 500, 400, true);

            //p.MainWindowHandle是你要移动的窗口的句柄;200,300是移动后窗口左上角的横纵坐标;500,400是移动后窗口的宽度和高度;true表示移动后的窗口是需要重画
            Thread.Sleep(2000);
            MoveWindow(p.MainWindowHandle, 100, 100, 300, 300, true);
        }

    }
调用实例:
A a =new A();
            a.OpenAndSetWindow("notepad.exe");
zcs独裁者积分等级:LV0 经验等级:Exp0
#4发表于 2014-03-10 10:22

@蓝盟小侃
其实,如何你想在C#里面实现Win32的调用可以这样 public class A { //调用Win32 API [System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint = "MoveWindow")] public static extern bool MoveWindow(System.IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint); //打开窗体方法,fileName是C++的窗体名称,包含路径 public void OpenAndSetWindow(String fileName) { Process p = new Process();//新建进程 ……

恩,之前我就类似这么操作过,但是好像用p.MainWindowHandle获取的只是窗体的句柄,当用API移动的时候只移动了窗体,窗体上面的控件并没有移动,而且原来的窗体也还在,效果如下图:右边的是打开的效果,左边的是移动后的效果,但是移动后左边打开的那个仍然存在。

后面又单独获取这个窗口的句柄(赋值给变量ssHandle),和Process.MainWindowHandle的句柄值不一样,我又直接在API里用ssHandle作为参数就能得到正确的移动效果,这应该是Process.MainWindowHandle的值不正确,那么怎样才能正确获取Process.Start()方法打开的那个程序界面的句柄呢?


@zcs独裁者 编辑于 2014-03-10 17:40
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#5发表于 2014-03-11 10:33

@zcs独裁者
恩,之前我就类似这么操作过,但是好像用p.MainWindowHandle获取的只是窗体的句柄,当用API移动的时候只移动了窗体,窗体上面的控件并没有移动,而且原来的窗体也还在,效果如下图:右边的是打开的效果,左边的是移动后的效果,但是移动后左边打开的那个仍然存在。

后面又单独获取这个窗口的句柄(赋值给变量ssHandle),和Process.MainWindowHandle的句柄值不一样,我又直接在API里用ssHandle作为参数就能得到正确的移动效果,这应该是Process.MainWindowHandle的值不正确,那么怎样才能正确获取Process.Start()方法打开的……

是一样的。p.MainWindowHandle获取的句柄没问题
zcs独裁者积分等级:LV0 经验等级:Exp0
#6发表于 2014-03-11 11:00

@蓝盟小侃
是一样的。p.MainWindowHandle获取的句柄没问题……

的确,我用windows自带的计算器测试了,如你所说,而且移动也能得到想要的效果。但是有的程序却不行,难道和窗体类型有关?还是和什么有关?
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#7发表于 2014-03-12 06:26

@zcs独裁者
的确,我用windows自带的计算器测试了,如你所说,而且移动也能得到想要的效果。但是有的程序却不行,难道和窗体类型有关?还是和什么有关?……

这,把你测试那个软件发来看看
zcs独裁者积分等级:LV0 经验等级:Exp0
#8发表于 2014-03-12 23:21

@蓝盟小侃
这,把你测试那个软件发来看看……

怎么发给你啊,这上面好像不能直接上传啊。。。。。。。
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#9发表于 2014-03-13 06:48

@zcs独裁者
怎么发给你啊,这上面好像不能直接上传啊。。。。。。。……

 你可以上传到蓝盟分享上。
zcs独裁者积分等级:LV0 经验等级:Exp0
#10发表于 2014-03-13 09:24

@蓝盟小侃
 你可以上传到蓝盟分享上。……







已上传,搜索“串口“就可以找到

zcs独裁者积分等级:LV0 经验等级:Exp0
#11发表于 2014-03-13 09:25

@蓝盟小侃
 你可以上传到蓝盟分享上。……

你为毛每次起这么早?
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#12发表于 2014-03-13 12:36

@zcs独裁者
你为毛每次起这么早?……

早起早睡身体好~
zcs独裁者积分等级:LV0 经验等级:Exp0
#13发表于 2014-03-17 10:37

@蓝盟小侃
早起早睡身体好~……

你试我上传的那个软件没?
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#14发表于 2014-03-19 23:19

@zcs独裁者
你试我上传的那个软件没?……

啊哦,不好意思,最近比较忙,刚看见,这几天抽个时间帮你看看,抱歉了。
zcs独裁者积分等级:LV0 经验等级:Exp0
#15发表于 2014-03-20 10:41

@蓝盟小侃
啊哦,不好意思,最近比较忙,刚看见,这几天抽个时间帮你看看,抱歉了。……

额。。。。。你太客气了。。。。。。。能帮忙已经很感谢你了。。。。。。
lenovo积分等级:LV0 经验等级:Exp0
#16发表于 2014-08-23 18:12
可以操作其他程序的按钮不?想搞一个程序,让他能自动完成一系列的点击别的程序按钮的动作。
蓝盟小侃积分等级:LV1 经验等级:Exp0社区管理员
#17发表于 2015-05-27 15:58

@lenovo
可以操作其他程序的按钮不?想搞一个程序,让他能自动完成一系列的点击别的程序按钮的动作。……

可以的,获取下他的句柄就可以了
追梦人456积分等级:LV0 经验等级:Exp0
#18发表于 2016-06-02 17:16
近期着急寻找这方面的知识,学习积累一下