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界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
随机推荐
- Centos 7.5 MySql的安装和配置
一.安装 三个步骤: wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpmyum -y ins ...
- pushd 和 popd
可以把你当前的文件路径 放进一个栈里,后边拿出来 很方面的skim方法
- Mysql数据库基础第二章:(九)分页查询
Mysql数据库基础系列 软件下载地址 提取码:7v7u 数据下载地址 提取码:e6p9 mysql数据库基础第一章:(一)数据库基本概念 mysql数据库基础第一章:(二)mysql环境搭建 mys ...
- leetcode 814. 二叉树剪枝 【时间击败100.00%】【 内存击败84.62%】
1 public TreeNode pruneTree(TreeNode root) { 2 dfs(root,null,-1); 3 return root; 4 } 5 6 public void ...
- 小程序中使用less
小程序中使用Less 原生小程序不支持less,其他基于小程序的框架大体都支持,如wepy,mpvue,taro等.但是仅仅因为一个less功能,而且引入一个框架,肯定是不可取的.因此可以用以下方式来 ...
- kiaba启动报 FATAL ResponseError: access_control_exception,ES报:java.lang.SecurityException: access denied ("java.io.FilePermission"“文件地址”)
查了许多博客,找的头都大了还是没有发现问题的根源,之前以为是插件包文件名改了之后还是一样,当我差点放弃的时候 一位博主的瞬间把我点醒https://www.cnblogs.com/personblog ...
- 宝塔面板Nginx开启gzip,提高网站访问速度的方法
这篇文章主要为大家详细介绍了宝塔面板Nginx开启gzip,提高网站访问速度的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. 最近有用户问小编说在宝塔面板N ...
- QListWidget调用Clear时报错:ASSERT failure in QList<T>::at: "index out of range"的解决方法
原因:连接了信号currentRowChanged(int)和槽,当选中其中的一行时,在调用Clear函数就会报错. 解决方法:不连接currentRowChanged(int)信号和槽,改为连接it ...
- 简易FTP
老男孩----上海校区 简易FTP 客户端端 import socket import struct import json import os class MYTCPCLIENT: address_ ...
- HTML复习(17.表格样式)
重点 掌握caption-side(表格标题位置) 掌握border-collapse(表格边框合并) 掌握border-spacing(表格边框间距) 表格标题位置在CSS中,我们可以使用capti ...