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界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
随机推荐
- Grafana + Prometheus 监控 Zookeeper
废话不多说,前几篇已经相应的介绍Grafana 跟 Prometheus,如有不清楚,请参考: https://www.cnblogs.com/zgz21/p/12054518.html https: ...
- 3.Linux安装docker
Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包到一个容器中,然后很容易地发布和应用到任意平台中. 进入docker官网找到安装文档 https://docs ...
- CF1534F2 Falling Sand (Hard Version)
个人思路: 每个点向相邻沙子连边,向本列和相邻 \(2\) 列下方第一个沙子连边. 对于一个 DAG,所有入度为 \(0\) 的点会覆盖全部点.我们缩点即可通过 F1. 但是这样做是过不了 F2 的. ...
- Linux详解
什么是操作系统?1.操作系统:(Operating System,OS)是计算机系统中的一个系统软件,它们管理和控制计算机系统中的硬件及软件资源,为用户提供一个功能强大.使用方便的和可扩展的工作环境. ...
- c语言中位运算符及用法 异或
a&b: 00000000 00000000 a&b=0x0 a|b : 00000000 01011111 a|b=0x5f a^b : 00000000 01011111 ...
- mysql查询锁表和表解锁的操作
转载自:https://www.cnblogs.com/qianxiaoruofeng/p/15542468.html 第一种 1.查询是否锁表 show OPEN TABLES where In_u ...
- SpringMVC-nfjh
SpringMVC springmvc项目创建 1.使用maven创建web项目结构 2.补充更改结构 3.springmvc-config.xml 1)添加包扫描(context命名空间) 2)添加 ...
- jmeter转义
/reportDetail?md5Key%3De7beff4c73ccd8f1cb01c383eda7fed0%26cid%3D1344500703825739777%26isShow%3Dfalse ...
- Epoll的使用例子
本篇文章在上一篇的基础上,使用 epoll 实现了一个事件监听和回调处理的模块.如何编写一个使用该模块的例子呢? 监测什么类型的fd,监测什么类型的事件,监测到事件以后需要做什么?后来可以看看如何将 ...
- 记录一个二级域名绑定动态ip的操作
家里的路由器,还有一台路由器需要登录,以前一直用f3322的动态域名绑定,感觉使用也还可以,但最近几个月,只要是f3322.com的二级域名全部被chrome标注为危险. 所以准备换一个免费的二级域名 ...