开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Win32 程序在启动时激活前一个启动程序的窗口

简介: 原文:Win32 程序在启动时激活前一个启动程序的窗口 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
+关注继续查看
原文:Win32 程序在启动时激活前一个启动程序的窗口

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系(walter.lv@qq.com)。 https://blog.csdn.net/WPwalter/article/details/82119769

UWP 程序天生单实例。当然,新 API (10.0.17134)开始也提供了多实例功能。不过,传统 Win32 程序可就要自己来控制单实例了。

本文介绍简单的几个 Win32 方法调用,使 Win32 程序也支持单实例。


激活之前进程的窗口

我们可以通过进程名称找到此前已经启动过的进程实例,如果发现,就激活它的窗口。

[STAThread]
static void Main(string[] args)
{
    var current = Process.GetCurrentProcess();
    var process = Process.GetProcessesByName(current.ProcessName).FirstOrDefault(x => x.Id != current.Id);
    if (process != null)
    {
        var hwnd = process.MainWindowHandle;
        ShowWindow(hwnd, 9);
        return;
    }

    // 启动自己的主窗口,此部分代码省略。
}

[DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr hwnd, uint nCmdShow);

你一定觉得那个 9 很奇怪,它是多个不同的 nCmdShow 的值:

  • 0 Hide
  • 1 Minimized
  • 2 Maximized
  • 9 Restore

另外,找到的窗口此时可能并不处于激活状态。例如在 Windows 10 中,此窗口可能在其他桌面上。那么我们需要添加额外的代码将其显示出来。

在前面的 ShowWindow 之后,再调用一下 SetForegroundWindow 即可将其激活到最前面来。如果在其他桌面,则会切换到对应的桌面。

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
var hwnd = process.MainWindowHandle;
ShowWindow(hwnd, 9);
SetForegroundWindow(hwnd);

找到并激活窗口

以上方法适用于普通的主窗口。然而当窗口并不是进程的主窗口,或者 ShowInTaskBar 设为了 false 的时候就不生效了(此时窗口句柄会改变)。

于是,我们需要改用其他的方式来查找窗口。

[STAThread]
static void Main(string[] args)
{
    var hwnd = FindWindow(null, "那个窗口的标题栏文字");
    if (hwnd != IntPtr.Zero)
    {
        ShowWindow(hwnd, 9);
        return;
    }

    // 启动自己的主窗口,此部分代码省略。
}

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

参考资料

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
上才艺——win32搞一个拼图游戏
上才艺——win32搞一个拼图游戏
12 0
11月6日云栖精选夜读 | Java 程序员必备的 15 个框架,前 3 个地位无可动摇!
Java 程序员方向太多,且不说移动开发、大数据、区块链、人工智能这些,大部分 Java 程序员都是 Java Web/后端开发。那作为一名 Java Web 开发程序员必须需要熟悉哪些框架呢? 今天,栈长我给大家列举了一些通用的、必须掌握的框架,学会这些,20K+ 不是问题。
2482 0
战胜柯洁后,AI在悄悄潜入人类下一个智慧堡垒
近日,在 QCon北京2017上,来自阿里巴巴认知计算实验室的技术专家龙海涛(花名德衡)发表了题为《星际争霸和AI》的专题演讲。《星际争霸》一直是游戏玩家心目中即时战略类的经典之作,历时十多年而不衰。
2032 0
C++ win32应用程序打开新窗口的方法
////maindlg.h #ifndef _MAIN_H #define _MAIN_H #include BOOL WINAPI Main_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR...
959 0
深入浅出Win32多线程程序设计之基本概念
一.深入浅出Win32多线程程序设计之基本概念[转] 引言  从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。
1162 0
wxpython实现程序最小到系统托盘的一个实例
一直在学习系统托盘的实现,于是自己写了一个简单的系统托盘实例,右键包括演示、最大化、最小化、退出和关于。在python2.6下测试通过。 # -*- coding: cp936 -*-import wxclass TaskBarIcon(wx.
1348 0
+关注
杰克.陈
一个安静的程序猿~
10424
文章
2
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载