博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 跨进程 设置窗口owner
阅读量:5090 次
发布时间:2019-06-13

本文共 3316 字,大约阅读时间需要 11 分钟。

原文:

窗口间跨进程通信

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     }

传递具体的数据,可参考:

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

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

1. 获取父窗口B的句柄

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

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

2. 设置子窗口A的owner

    var helper = new WindowInteropHelper(windowA);

    helper.Owner = windowBInptr;

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

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

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

其中,消息值的定义,不能窗口自带的消息值。窗口自带的消息列表,可参考 

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需要窗口反馈动画(反馈动画可以是模态,也可以是阴影,见我之前的水文《》)

 

posted on
2018-09-25 08:40 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/lonelyxmas/p/9697744.html

你可能感兴趣的文章
Vue
查看>>
springcloud注解@EnableDiscoveryClient与@EnableEurekaC
查看>>
全球计算机ACM总决赛浙大第…
查看>>
【1】【JUC】Condition和生产者消费者模型
查看>>
SQL SERVER 中将重复记录合并为一条记录
查看>>
CCPC-Wannafly Winter Camp Day1 流流流动 (树形dp)
查看>>
分页和异步验证注册
查看>>
浅谈javascript中的原型和继承
查看>>
元素或标签隐藏
查看>>
java必背面试题
查看>>
103 未写 vim使用
查看>>
Jmeter线程组创建及定义
查看>>
iOS开发之UITextView输入拼音前先输入英文问题解决办法
查看>>
ActiveMQ实战之 Queue点对点消息
查看>>
读<jquery 权威指南>[3]-动画
查看>>
读《程序员的SQL金典》[3]--表连接、子查询
查看>>
校内OJ 1128 词链(link)(Trie+DFS)
查看>>
Android中Activity的四种开发模式
查看>>
(转)如何判断客户端使用了代理服务器及其匿名级别?
查看>>
PHP中header的作用
查看>>