【进程间的通信】☞项目引入——C#通过Windows API 调用其他程序、触发按钮Click事件



前言


  在此之前对进程通信不太了解。


  最近因项目需要稍有涉足目前还在学习中。。。


正文


  项目需求


   两个独立的解决方案,属于两个项目,在系统中开辟两个进程。


   需要在第一个项目中调用第二个项目,对第二个项目进行操作。


   如:点击第一个项目的按钮,则触发第二个项目的按钮。


  deom演示


   针对项目需求,自己做了一个demo来进行尝试。


   在这里分享给大家  


   程序截图

    这里只对 被调用的程序 进行了截图, 调用窗体 只有一个button


    被调用程序包括两个窗体,第一个窗体有一个button,点击显示 TestChild 子窗体

    再次点击窗体 button “是”  , 会有弹出框显示:是。


    

     


   demo功能


    点击第一个程序的按钮,之后会调用第二个程序(截图的程序)

    连续自动点击两个按钮,最终显示提示框,内容为:是。


   代码说明


    首先为了使用API,添加引用命名空间

using System.Runtime.InteropServices;


       添加对API的引用

[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "FindWindowEx", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr hwndParent, uint hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hwnd, uint wMsg, int wParam, int lParam);

[DllImport("user32.dll", EntryPoint = "SetForegroundWindow", SetLastError = true)]
private static extern void SetForegroundWindow(IntPtr hwnd);


       实现过程

    思路:通过API,获取窗口句柄,根据窗口句柄给窗口发送消息,对窗体进行相应的操作


    代码中对应各个的 标题 可以通过VS自带的spy++获取,下面有附有spy++的简单使用

private void button1_Click(object sender, EventArgs e)
        {

            const int WM_CLICK = 0x00F5;//鼠标点击消息,各种消息的数值,可以参考MSDN

            string lpszName_Test = "Test";//主窗体的标题
            string lpszName_btnShow = "显示子窗体";//主窗体上button的标题

            string lpszName_TestChild = "TestChild";//子窗体的标题
            string lpszName_btnYes = "是";//子窗体上button的标题

            IntPtr hwndTest = new IntPtr();//主窗体的句柄
            IntPtr hwndbtnShow = new IntPtr();//主窗体上button的句柄

            IntPtr hwndTestChild = new IntPtr();//子窗体的句柄
            IntPtr hwndbtnYes = new IntPtr();//子窗体上button的句柄


            hwndTest = FindWindow(null, lpszName_Test);//获取主窗体的句柄
            hwndbtnShow = FindWindowEx(hwndTest, 0, null, lpszName_btnShow);//获取主窗体上button的句柄

            SetForegroundWindow(hwndTest);//使主窗体获得焦点
            SendMessage(hwndbtnShow, WM_CLICK, 0, 0);//给主窗体上button发送鼠标点击消息,

            hwndTestChild = FindWindow(null, lpszName_TestChild);//获取子窗体的句柄
            hwndbtnYes = FindWindowEx(hwndTestChild, 0, null, lpszName_btnYes);//获取子窗体上button的句柄

            SendMessage(hwndbtnYes, WM_CLICK, 0, 0);//给子窗体上button发送鼠标点击消息,

            //逻辑判断并不严谨,这里只是展示一个简单的过程

        }


  spy++使用

  
   首先运行程序

   在“工具”中选择Spy++

  

   从弹出的窗口中,选择 望远镜 的图片 

   再从弹出的窗口中,用鼠标选中 狙击镜的图标

   用鼠标拖到你的目标窗体,则会显示“句柄”、“标题”、“类”三个数据



   点击右上角“确定”按钮

   在“窗口1”中会高亮显示你的目标窗体

   右击选择属性

   弹出窗口显示更多的窗体信息。

   

结语


  笨~



已标记关键词 清除标记
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质? 你是否想成为一名资深开发人员,想开发别人做不了的高性能程序? 你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹?   那么C++就是你个人能力提升,职业之路进阶的不二之选。 【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。 2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。 3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。 【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署; 2.吊打一切关于C++的笔试面试题; 3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。 【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块 基础篇 本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。 进阶篇 本篇主要讲解编程中常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空等。 提升篇: 本篇可以帮助学员更加高效的进行c++开发,其中包含类型转换、文件操作、异常处理、代码重用等内容。
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页