Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 781|回复: 0

C# MainWindowHandle为0的解决方法

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-9-4 14:37:25 | 显示全部楼层 |阅读模式

    摘要:Process.MainWindowHandle无法获取已最小化的窗口的句柄,可以用FindWindow传入窗口标题文字来获取窗口句柄

     

    我最近做一个软件,需要只有一个进程运行,并且第二次点击程序后,要显示之前运行程序的窗口,再关掉当前进程。

     

    不过在使用Process.MainWindowHandle获取主窗体句柄时,发现无法获取已最小化窗体的句柄

     

    网上找了点资料,发现可以通过WindowsAPI来获取。

     

    思路如下

    1.使用Process.GetProcessesByName() 获取已运行的程序进程

    2.和当前进程对比,如果id不同,即为之前已开启的程序

    3.获取已开启进程的MainWindowHandle,如果为0,则使用FindWindow获取窗口句柄,并用GetWindowThreadProcessId函数来验证句柄属否属于该进程

     

    下面是代码

     

           /// <summary>
            /// 根据窗口标题查找窗体
            /// </summary>
            /// <param name="lpClassName"></param>
            /// <param name="lpWindowName"></param>
            /// <returns></returns>
            [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "FindWindow")]
            private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    
            /// <summary>
            /// 根据句柄查找进程ID
            /// </summary>
            /// <param name="hwnd"></param>
            /// <param name="ID"></param>
            /// <returns></returns>
            [System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
            public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
    
            /// <summary>
            /// 打开该程序主窗口
            /// </summary>
            public static void RaiseOtherProcess()
            {
                System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess();
                Process[] Proes = System.Diagnostics.Process.GetProcessesByName(proc.ProcessName);
                foreach (System.Diagnostics.Process otherProc in Proes)
                {
                    if (proc.Id != otherProc.Id)
                    {
                        IntPtr hWnd = otherProc.MainWindowHandle;
                        if (hWnd.ToInt32() == 0)
                        {
                            
                                hWnd = FindWindow(null, "程序主窗口标题");
    
                                int id = -1;
                                GetWindowThreadProcessId(hWnd, out id);
                                if (id == otherProc.Id)
                                    break;
                            
                        }

    //此处获取的hWnd即为之前运行程序的主窗口句柄,再使用其他函数打开窗体 break; } } }

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-4 14:32 , Processed in 0.077244 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表