C#向其实进程子窗体发送指令
近日,想在自己的软件简单控制其它软件的最大化最小化,想到直接向进程发送指令,结果一直无效,经过Spy++发现,原来快捷方式在子窗体上,所以需要遍历子窗体在发送指令,以下为参考代码:
1 [DllImport("user32.dll", SetLastError = true)]
2 public static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, IntPtr lParam);
3
4 /// <summary>
5 /// 发送消息到指定窗口
6 /// </summary>
7 /// <param name="hWnd">其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,
8 /// 包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口</param>
9 /// <param name="msg">指定被发送的消息</param>
10 /// <param name="wParam">指定附加的消息指定信息</param>
11 /// <param name="lParam">指定附加的消息指定信息</param>
12 /// <returns></returns>
13 [DllImport("User32.dll", EntryPoint = "SendMessage")]
14 private static extern IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam);
15
16 [DllImport("User32.dll")]
17 public static extern int FindWindow(string lpClassName, string lpWindowName);
18
19 [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
20 public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
21
22 /// <summary>
23 /// 获取指定窗体的所有子窗体
24 /// </summary>
25 /// <param name="WinHandle">窗体句柄</param>
26 /// <param name="ec">回调委托</param>
27 /// <param name="name">自定义</param>
28 /// <returns></returns>
29 [DllImport("User32.dll")]
30 public static extern int EnumChildWindows(IntPtr WinHandle, EnumChildWindow ecw, string name);
31
32 /// <summary>
33 /// 用于枚举子窗体是的委托
34 /// </summary>
35 /// <param name="WindowHandle">窗体句柄</param>
36 /// <param name="num">自定义</param>
37 /// <returns></returns>
38 public delegate bool EnumChildWindow(IntPtr WindowHandle, string num);
39
40 /// <summary>
41 /// 获取窗体类型
42 /// </summary>
43 /// <param name="WinHandle">窗体句柄</param>
44 /// <param name="Type">类型</param>
45 /// <param name="size">缓冲区大小</param>
46 /// <returns></returns>
47 [DllImport("user32.dll")]
48 public static extern int GetClassName(IntPtr WinHandle, StringBuilder Type, int size);
49
50 /// <summary>
51 /// 获取指定窗体的标题
52 /// </summary>
53 /// <param name="WinHandle">窗体句柄</param>
54 /// <param name="Title">缓冲区取用于存储标题</param>
55 /// <param name="size">缓冲区大小</param>
56 /// <returns></returns>
57 [DllImport("User32.dll")]
58 public static extern int GetWindowText(IntPtr WinHandle, StringBuilder Title, int size);
59
60 /// <summary>
61 /// 根据句柄获得进程id值
62 /// </summary>
63 /// <param name="handle">句柄</param>
64 /// <param name="pid"></param>
65 /// <returns></returns>
66 [DllImport("user32")]
67 private static extern int GetWindowThreadProcessId(IntPtr handle, out int pid);
68
69 [DllImport("user32.dll")]
70 public static extern int FindWindowEx(int hwndParent, int hwndChildAfter,
71 string lpszClass, string lpszWindow);
72
73 [DllImport("user32.dll")]
74 public static extern int GetLastActivePopup(int hWnd);
75 [DllImport("user32.dll")]
76 public static extern int AnyPopup();
77 [DllImport("user32.dll")]
78 public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
79 [DllImport("user32.dll")]
80 public static extern int EnumThreadWindows(int dwThreadId, CallBack lpfn, int lParam);
81 [DllImport("user32.dll")]
82 public static extern int EnumWindows(CallBack lpfn, int lParam);
83 [DllImport("user32.dll")]
84 public static extern int EnumChildWindows(int hWndParent, CallBack lpfn, int lParam);
1 public const int WM_SYSCOMMAND = 0x112;
2 public const int WM_SYSCOMMAND1 = 0x111;
3 const int WM_SYSKEYDOWN = 0x104;
4 const int WM_SYSKEYUP = 0x105;
5
6 public const int SC_CLOSE = 0xF060;// '关闭窗体
7 public const int SC_MINIMIZE = 0xF020;// '最小化窗体
8 public const int SC_MAXIMIZE = 0xF030;// '最大化窗体
9 public const int SC_RESTORE = 0xF120;// '恢复窗体大小
10 public const int WM_SETTEXT = 0xC;// '设置窗体的Caption
11 public const int WM_GETTEXT = 0xD;// '取得窗体的caption
12 public const int LOGINFORM_MSG = 0x400;
13 public const int WM_KEYDOWN = 0x0100;
14 public const int WM_KEYUP = 0x0101;
15 private const int VK_ESCAPE = 0x1B;
1 /// <summary>
2 /// 回调函数代理
3 /// </summary>
4 public delegate bool CallBack(int hwnd, int lParam);
5 [DllImport("user32.dll")]
6 public static extern int EnumWindows(CallBack lpfn, int lParam);
7 [DllImport("user32.dll", SetLastError = true)]
8 public static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, IntPtr lParam);
9
10 /// <summary>
11 /// 发送消息到指定窗口
12 /// </summary>
13 /// <param name="hWnd">其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,
14 /// 包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口</param>
15 /// <param name="msg">指定被发送的消息</param>
16 /// <param name="wParam">指定附加的消息指定信息</param>
17 /// <param name="lParam">指定附加的消息指定信息</param>
18 /// <returns></returns>
19 [DllImport("User32.dll", EntryPoint = "SendMessage")]
20 private static extern IntPtr SendMessage(int hWnd, int msg, IntPtr wParam, IntPtr lParam);
21
22 [DllImport("User32.dll")]
23 public static extern int FindWindow(string lpClassName, string lpWindowName);
24
25 [DllImport("User32.dll", EntryPoint = "FindWindowEx")]
26 public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);
27
28 /// <summary>
29 /// 进程窗口回调函数代理
30 /// </summary>
31 public CallBack callBackEnumThreadWindows = new CallBack(ThreadWindowProcess);
32 /// <summary>
33 /// 窗口回调函数代理
34 /// </summary>
35 public CallBack callBackEnumWindows = new CallBack(WindowProcess);
36 /// <summary>
37 /// 子窗口回调函数代理
38 /// </summary>
39 public static CallBack callBackEnumChildWindows = new CallBack(ChildWindowProcess);
40 /// <summary>
41 /// 窗口回调处理函数
42 /// </summary>
43 /// <param name="hwnd"></param>
44 /// <param name="lParam"></param>
45 /// <returns></returns>
46 public static bool WindowProcess(int hwnd, int lParam)
47 {
48 EnumChildWindows(hwnd, callBackEnumChildWindows, 0);
49 return true;
50 }
51 /// <summary>
52 /// 子窗口回调处理函数
53 /// </summary>
54 /// <param name="hwnd"></param>
55 /// <param name="lParam"></param>
56 /// <returns></returns>
57 public static bool ChildWindowProcess(int hwnd, int lParam)
58 {
59 if (hwnd > 0)
60 {
61 //发送Esc退出全屏指令
62 long result = SendMessage(hwnd, WM_KEYDOWN, new IntPtr((int)Keys.Escape), new IntPtr(SC_RESTORE)).ToInt64();
63
64 result = SendMessage(hwnd, WM_SYSCOMMAND, new IntPtr((int)Keys.Escape), new IntPtr(VK_ESCAPE)).ToInt64();
65 }
66 return true;
67 }
68
69 //调用方法,直接在监测子过程中处理发送消息
70 EnumWindows(callBackEnumWindows, 0);
另外一种方法是直接向进程发送指令
Process[] pros = Process.GetProcesses(); //获取本机所有进程
for (int i = 0; i < pros.Length; i++)
{
if (pros[i].ProcessName == "EzvizStudio") //名称为ProcessCommunication的进程
{
IntPtr hWnd = pros[i].MainWindowHandle; //获取ProcessCommunication.exe主窗口句柄
IntPtr ExitWnd = FindWindowEx(hWnd, new IntPtr(0), null, "");
if (ExitWnd != IntPtr.Zero)
{
long result = SendMessage((int)ExitWnd, WM_KEYDOWN, new IntPtr((int)Keys.Escape), new IntPtr(SC_RESTORE)).ToInt64(); result = SendMessage((int)hWnd, WM_SYSCOMMAND, new IntPtr((int)Keys.Escape), new IntPtr(VK_ESCAPE)).ToInt64();
} //SendMessage(hWnd, 0x0100, (IntPtr)data, (IntPtr)0); //点击该按钮,以文本框数据为参数,向Form1发送WM_KEYDOWN消息
// ProcessExtensions.SendKey(pros[i], Keys.Escape);
break;
}
}
另外可以直接向系统发送快捷指令
long result = SendMessage(WINDOW_HANDLER, WM_SYSCOMMAND, new IntPtr((int)Keys.Escape), new IntPtr(VK_ESCAPE)).ToInt64();
C#向其实进程子窗体发送指令的更多相关文章
- CN消息的来源——父窗口不知道怎么处理,于是把这个消息加上CN_BASE在分发到实际的子窗体
VCL存在一些非API消息以供其内部使用,为什么要这样做呢?这要从WM_COMMAND & WM_NOTIFY消息说起,我们说WM_COMMAND消息并不是直接发给实际产生消息的窗体,而是发送 ...
- WPF 利用子线程弹出子窗体的研究
一般来说子线程都是用来处理数据的,主窗体用来实现展现,但是有些时候我们希望子窗体实现等待效果,遮挡主窗体并使主窗体逻辑正常进行,这个业务需求虽然不多,但是正好我们用到了,于是我打算把研究成果写在这了. ...
- 附实例!实现iframe父窗体与子窗体的通信
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由前端林子发表于云+社区专栏 本文主要会介绍如何基于MessengerJS,实现iframe父窗体与子窗体间的通信,传递数据信息.同时本 ...
- DevExpress第三方控件使用实例之ASPxPopupControl弹出子窗体
弹出页面控件:ASPxPopupControl, <dxpc:ASPxPopupControl ID="popubCtr" runat="server" ...
- WPF 子窗体关闭,刷新父窗体
父窗体代码 private void DGUserEdit() { if(DGUser.SelectedItem!=null) { DataRow dr = (DGUser.SelectedItem ...
- WPF 子窗体关闭时显示父窗体
这个问题纠结了两天,今天在一个朋友的帮助下,解决了,其实很简单,但是可能作为新手,接触WPF时间还是短,因此作为一个问题困扰了我. 父窗体部分代码 private void EditInformati ...
- winform里操作打开在panel里的form窗体,子窗体操作同级子窗体或者父窗体的方法
最近开始了一个winform项目,原先一直都是web项目.遇到个问题,就是在框架内,左侧和中间的main都是用panel来实现的form,就是把form窗体打开到panel里,实现左侧是导航,中间是操 ...
- winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体
winform打开子窗体后,在子窗体中刷新父窗体,或者关闭子窗体刷新父窗体,搜集了几个方法,列举如下: 一 . 所有权法 父窗体,名称为“fuForm”,在父窗体中有个公共刷新方法,也就是窗体数据初始 ...
- c#在主窗体panel 容器内嵌入另一个窗体(子窗体)的实现
主窗体: 子窗体: 把子窗体嵌入到主窗体的panel 右侧中: 代码: { public MainForm() { InitializeComponent(); } private void Clo ...
- Android线程之主线程向子线程发送消息
和大家一起探讨Android线程已经有些日子了,谈的最多的就是如何把子线程中的数据发送给主线程进行处理,进行UI界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
随机推荐
- SPI接口(续一)
SPI接口共涉及到11个寄存器,下面就来对它们进行具体分析. 先来看SPI配置寄存器CFG,下表是它的全部位结构,其地址分别为0x40058000(SPI0),0x4005C000(SPI1). (1 ...
- 95、linux安装es
参考大佬文章 https://blog.csdn.net/b13001216978/article/details/110817204 1.由于elasticsearch7.4.0需要jdk11支持, ...
- mysql主从备份双机热备实现方法
1.环境准备 主服务器(master):192.168.1.1 从服务器(slave):192.168.1.2 要求主从服务器mysql版本相同且大于3.23 2.主服务器 2.1创建同步用户 cre ...
- nginx代理出现上传文件过大解决办法
1.错误描述 2.错误原因 1.上传文件时,利用localhost访问系统,不会出现这个问题:用域名访问这个系统时,出现这个问题,提示是:请求实体太大 由于Nginx反向代理服务器client_max ...
- const引用和指针
1.可以为const引用初始化一个非const的对象.字面值,甚至是一般表达式. 2.对引用初始化时必须严格进行类型匹配,但是const引用初始化时不需要类型匹配,只要可以转换为const所定义的类型 ...
- MySQL 打开慢查询 主从同步状态
MySql 打开慢查询 set global log_output='FILE'; SET GLOBAL slow_query_log = ON; SET GLOBAL long_query_time ...
- 基于Jenkins实现可腹部回滚的cicd平台
Jenkins :是一个开源的实现持续集成的工具,可以实施监控持续集成过程中所存在的问题,提供详细的日志文件和提醒功能,还能用图表的形式直观的展示出项目构建的趋势和稳定性 maven:只有在Java项 ...
- 20191317 Exp2-后门原理与实践
20191317 Exp2-后门原理与实践 实验基础 本次实验需要我们掌握后门的基础知识,学习使用nc实现Windows,Linux之间的后门连接,学习使用Metaspolit的msfvenom指令生 ...
- 使用Wireshark完成实验1
用来观察协议执行实体之间交换的报文的基本工具被称为分组嗅探器(packet sniffer),一个分组嗅探器被动地拷贝(嗅探)计算机发送和接受的报文,也能显示出这些被捕获报文的各个协议字段的内容.Wi ...
- spring的作用
Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB.如果你仅仅使用了Struts或其他的包含了J2EE特有API的framework,你会发现Spring关注了遗留下的问题.Sprin ...