C# 跨进程 设置窗口owner

简介: 窗口间跨进程通信 1. 发送方 1 public const int WM_InsertChart_Completed = 0x00AA; 2 3 //查找窗口 4 [DllImport("User32.

窗口间跨进程通信

1. 发送方

 1     public const int WM_InsertChart_Completed = 0x00AA;
 2 
 3     //查找窗口
 4     [DllImport("User32.dll", EntryPoint = "FindWindow")]
 5     public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 6 
 7     //发送信息
 8     [DllImport("User32.dll", EntryPoint = "SendMessage")]
 9     public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
10 
11     private void PostMessage()
12     {
13         var procs = Process.GetProcessesByName("MyExample");
14 
15         foreach (var process in procs)
16         {
17             SendMessage(process.MainWindowHandle, WM_InsertChart_Completed, IntPtr.Zero, IntPtr.Zero);
18         }
19     }

还有一个PostMessage方法,和SendMessage类似。

2. 接收方

在winform中,不同进程间窗口通信

1 protected override void DefWndProc(ref Message m)
2 {
3     ......
4 }

在WPF中,如何在俩个不同进程的窗口之间通信.

 1     protected override void OnSourceInitialized(EventArgs e)
 2     {
 3         base.OnSourceInitialized(e);
 4         var hwndSource = PresentationSource.FromVisual(this) as HwndSource;
 5         hwndSource?.AddHook(new HwndSourceHook(WndProc));
 6     }
 7     public const int WM_InsertChart_Completed = 0x00AA;
 8     public static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
 9     {
10         if (msg == WM_InsertChart_Completed )
11         {
12                       .............
13         }
14 
15         return hwnd;
16     }

传递具体的数据,可参考:http://www.360doc.com/content/18/0131/15/45112790_726705014.shtml

跨进程设置窗口owner,并禁用父窗口

 此跨进程案例中,以子窗口A与父窗口B为例

1. 获取父窗口B的句柄

windowB的句柄Inptr,可以通过应用程序的名称或者线程Id,获取窗口的句柄。具体可参考 C# 通过进程名/进程Id 操作窗口 

注:客户端之间如果有跨线程通信机制(局域网等),可以直接将父窗口B的句柄传给另一进程的子窗口A

2. 设置子窗口A的owner

    var helper = new WindowInteropHelper(windowA);
    helper.Owner = windowBInptr;

设置后,仅仅是显示在父窗口B的上层。禁用父窗口见下~

3. 通过消息机制禁用父窗口

子窗口A弹出后,向父窗口B发送禁用窗口消息:

其中,消息值的定义,不能窗口自带的消息值。窗口自带的消息列表,可参考 https://www.itsvse.com/thread-2755-1-1.html

 1         public const int Msg_SetWindowUnEnabled = 100000;
 2         public const int Msg_SetWindowEnabled = 100001;
 3 
 4         public static void SetWindowUnEnabled(IntPtr windowIntPtr)
 5         {
 6             SendMessage(windowIntPtr, Msg_SetWindowUnEnabled, IntPtr.Zero, IntPtr.Zero);
 7         }
 8 
 9         public static void SetWindowEnabled(IntPtr windowIntPtr)
10         {
11             SendMessage(windowIntPtr, Msg_SetWindowEnabled, IntPtr.Zero, IntPtr.Zero);
12         }
13 
14         //发送信息
15         [DllImport("User32.dll", EntryPoint = "SendMessage")]
16         public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

父窗口监听消息,并处理子窗口A发送的窗口禁用消息

 1     protected override void OnSourceInitialized(EventArgs e)
 2     {
 3         base.OnSourceInitialized(e);
 4         var hwndSource = PresentationSource.FromVisual(this) as HwndSource;
 5         hwndSource?.AddHook(new HwndSourceHook(WndProc));
 6     }
 7 
 8     public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
 9     {
10         if (msg == WindowHandleHelper.Msg_SetWindowUnEnabled)
11         {
12             this.IsEnabled = false;
13         }
14         else if (msg == WindowHandleHelper.Msg_SetWindowEnabled)
15         {
16             this.IsEnabled = true;
17         }
18 
19         return hwnd;
20     }

 4. 跨进程的模态窗口

以上设置将窗口A置于另一进程的窗口B上层,并将窗口B设置为禁用。

如果窗口A需要窗口反馈动画(反馈动画可以是模态,也可以是阴影,见我之前的水文《WPF window 子窗口反馈效果(抖动/阴影渐变)》),怎么办?

待处理--之后会更新

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
目录
相关文章
|
11天前
|
C#
C# DEV 关于设置gridview 指定单元格字体为红色
C# DEV 关于设置gridview 指定单元格字体为红色
|
11天前
|
C#
C# DEV TextEdit 设置文本框只能输入数字(整数)
C# DEV TextEdit 设置文本框只能输入数字(整数)
|
3月前
|
数据采集 API 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPISDK设置软件触发模式(C#)
38 1
|
3月前
|
存储 数据管理 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机本身的数据保存(CustomData)功能(C#)
26 0
|
1月前
|
设计模式 C#
36.c#:如何设置MDL窗口
36.c#:如何设置MDL窗口
15 1
|
1月前
|
C# 开发者
35.c#:winform窗口
35.c#:winform窗口
10 1
|
3月前
|
编解码 监控 开发工具
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C#)
Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的图像剪切(ROI)功能(C#)
14 0
|
29天前
|
Unix Shell Linux
Linux 终端和进程的关系,以及在终端前后台切换进程
Linux 终端和进程的关系,以及在终端前后台切换进程
27 1
|
28天前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】⭐⭐⭐Linux 限制进程资源 ulimit命令 使用指南
【Shell 命令集合 系统设置 】⭐⭐⭐Linux 限制进程资源 ulimit命令 使用指南
37 0
|
28天前
|
监控 Shell Linux
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
【Shell 命令集合 系统管理 】⭐⭐⭐Linux 向进程发送信号 kill命令 使用指南
31 0