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界面的更新,为什么要这样,请查阅之前的随笔.本篇我们就来讨论一下关于主线程向子线程如何发 ...
随机推荐
- Posggresql插件Multicorn安装问题总结
根据官网https://multicorn.readthedocs.io/en/latest/installation.html的安装指南下载安装,关键信息: Postgresql 9.1+ Post ...
- localStorage/sessionStorage/cookie
html5本地存储主要有两种localStorage和sessionStorage 都是使用相同api,存入后都是字符串类型 localStorage和sessionStorage使用方 ...
- 实践:腾讯云COS备份本地数据以及异地备份
在当前大数据时代背景下,数据在业务中占有不可低估的地位,数据备份已然成为了最后一道屏障. 腾讯云对象存储COS,提供数据备份.共享.大数据处理.线上数据托管一站式解决方案,成为了不少企业和个人用户备份 ...
- Go语言互斥锁(sync.Mutex)和读写互斥锁(sync.RWMutex)
暴力锁 package main import ( "fmt" "sync" "time" ) /* Go语言包中的 sync 包提供了两种 ...
- VeeValidate 注册实例
注册 1 安装: npm install vee-validate --save 2.mian.js 填写 import Vue from 'vue' import VeeValidate, {Val ...
- How to use lspci, lsscsi, lsusb, and lsblk to get Linux system devices information
There are many utilities available to check Linux system hardware information. Some commands report ...
- python+pytesseract识别图片文字
此文只介绍一下python+pytesseract识别一些简单图片的数字,字母和汉字.如图1 import pytesseract from PIL import Image,ImageEnhance ...
- c++11 智能指针学习汇总
c++为什么要引入智能指针? C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置 ...
- elementUI el-input 调整数据但是前端界面不刷新
在表格行中提供一个输入框,允许用户输入,并且可以进行简单的四则计算,计算在onblur或者回车触发. <el-input v-model="scope.row[scope.column ...
- mac中chrome常用快捷键
1.标签页和窗口快捷键 ⌘-N 打开新窗口. ⌘-T ...