使用API函数查找窗体并激活

 生成程序时,有时需要限制用系统中只有一个实例在运行,这就需要我们在检测到系统中已有程序的实例在运行时,将
这个已经在运行的实例,激活并显示在用户面前
这里主要用到了FindWindow ,和 SetForegroundWindow这两个函数

 

  /// <summary>
/// The FindWindow API
/// </summary>
/// <param name="lpClassName">the class name for the window to search for</param>
/// <param name="lpWindowName">指向一个指定了窗口名(窗口标题)的空结束字符串。
/// 如果该参数为空,则为所有窗口全匹配。</param>
/// <returns>如果函数成功,返回值为具有指定类名和窗口名的窗口句柄;如果函数失败,返回值为NULL</returns>
[DllImport("User32.dll", CharSet = CharSet.Auto, EntryPoint = "FindWindow", SetLastError = true)]
public static extern IntPtr FindWindow(String lpClassName, String lpWindowName);

/// <summary>
/// 函数功能:该函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。
/// 这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
/// </summary>
/// <param name="hwndParent">要查找子窗口的父窗口句柄。
///  如果hwnjParent为NULL,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口。
///</param>
/// <param name="hwndChildAfter">子窗口句柄。查找从在Z序中的下一个子窗口开始。
/// 子窗口必须为hwndPareRt窗口的直接子窗口而非后代窗口。
/// 如果HwndChildAfter为NULL,查找从hwndParent的第一个子窗口开始。
/// 如果hwndParent 和 hwndChildAfter同时为NULL,
/// 则函数查找所有的顶层窗口及消息窗口。</param>
/// <param name="lpszClass"></param>
/// <param name="lpszWindow"></param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(int hwndParent, int hwndChildAfter, string lpszClass, string lpszWindow);

/// <summary>
/// 该函数设置指定窗口的显示状态。
/// </summary>
/// <param name="hWnd">窗口句柄</param>
/// <param name="nCmdShow">指定窗口如何显示</param>
/// <returns></returns>
[DllImport("user32.dll", EntryPoint = "ShowWindow")]
public static extern IntPtr ShowWindow(IntPtr hWnd, int nCmdShow); 

/// <summary>
/// 函数功能:该函数将创建指定窗口的线程设置到前台,
/// 并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。
/// 系统给创建前台窗口的线程分配的权限稍高于其他线程。
/// </summary>
/// <param name="hWnd">将被激活并被调入前台的窗口句柄</param>
/// <returns>如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零</returns> 
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

//使用方法
 string winclass = "WindowsForms10.Window.8.app.0.378734a";
IntPtr winfrom = cxyApi.FindWindow(winclass, "Form1");
cxyApi.ShowWindow(winfrom, APINameHelper.SW_NORMAL);
cxyApi.SetForegroundWindow(winfrom);

//一些常量
public class APINameHelper
{
    public const int SW_HIDE = 0; //隐藏窗口,活动状态给令一个窗口 
    /// <summary>
    /// 用原来的大小和位置显示一个窗口,同时令其进入活动状态
    /// </summary>
    public const int SW_SHOWNORMAL = 1;  
    public const int SW_NORMAL = 1;
    public const int SW_SHOWMINIMIZED = 2;
    public const int SW_SHOWMAXIMIZED = 3;
    public const int SW_MAXIMIZE = 3;
    public const int SW_SHOWNOACTIVATE = 4; //用最近的大小和位置显示一个窗口,同时不改变活动窗口
    public const int SW_SHOW = 5;//用当前的大小和位置显示一个窗口,同时令其进入活动状态
    public const int SW_MINIMIZE = 6;//最小化窗口,活动状态给令一个窗口
    public const int SW_SHOWMINNOACTIVE = 7;//最小化一个窗口,同时不改变活动窗口
    public const int SW_SHOWNA = 8;//用当前的大小和位置显示一个窗口,不改变活动窗口
    public const int SW_RESTORE = 9; //与 SW_SHOWNORMAL  1 相同
    public const int SW_SHOWDEFAULT = 10;
    public const int SW_FORCEMINIMIZE = 11;
    public const int SW_MAX = 11;

    public const int WM_CHAR = 0x0102;
    public const int WM_KEYDOWN = 0x0100;
    public const int WM_KEYUP = 0x0101;

    public const int WM_PASTE = 0x0302;
    public const int WM_CLEAR = 0x0303;
}

时间: 2024-11-01 19:36:02

使用API函数查找窗体并激活的相关文章

Windows API 函数列表 附帮助手册

原文:Windows API 函数列表 附帮助手册 所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了.   帮助手册:700多个Windows API的函数手册 免费下载   API之网络函数 API之消息函数 API之文件处理函数 API之打印函数 API之文本和字体函数 API之菜单函数 API之位图.图标和光栅运算函数 API之绘图函数 API之设备场景函数 API之硬件与系统函数 API之进程和线程函数 API之控件与消息函数     1. API

Windows API函数大全(完整)_其它相关

1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconne

windows常用 API函数

系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时

windows常用API函数

系统API查询 http://www.vbgood.com/api.html http://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3 第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄, 这个函数的定义是这样的 HWND WINAPI FindWindow(LPCSTR lpClassName,LPCSTR lpWindowName);第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时

使用API函数播放MP3等音频文件的类设计(C#)

函数|设计 C#没有提供播放MP3等音频文件的类,要编写播放MP3等音频文件程序,必须使用第三方控件或类.本文使用API函数mciSendString,编写一个播放MP3等音频文件的类. 具体源码如下: 一.使用API函数mciSendString构成的媒体播放类.using System;using System.Runtime.InteropServices; using System.Text; using System.IO ; namespace clsMCIPlay{ /// <su

介绍一个功能强大的API函数 ShellExecute

问题的提出: 我使用MFC编写一个APP,要求About对话框中显示LOGO.公司名.地址和公司的URL链接.使用户点击URL链接以后,启动浏览器访问Web页面,这种对话框中的热链接使应用程序增色不少.我琢磨的方法是 从系统注册表中通过查找.htm 或 .html文件的关联程序来获得缺省浏览器的名字,这样好象有很多工作要做.此外,如果浏览器已经打开,总是开始一个新的实例替代当前已有的一个实例.想找一个容易一 点的方法,但我查过有关的资料,没有收获,请高手指教. 解决方法: 如果有这样的一个API

WinForm特效:同时让两个窗体有激活效果

windows api,一个窗体激活的时候给另外一个发消息 using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication43 { public partial class Form1 : Form { Form frm =null; public Form1() { InitializeComponent(); this.Activated

javascript字符串对象常用api函数小结(连接,替换,分割,转换等)_javascript技巧

本文实例讲述了javascript字符串对象常用api函数.分享给大家供大家参考,具体如下: 1. concat(str1,str2,···) 连接字符串 2. indexOf(str,start) 返回 str 在字符串中首次出现的位置 var str = "hello world"; str.indexOf("hello"); // 0 str.indexOf("o",5); // 7 str.indexOf("World"

Linux 编程中的API函数和系统调用的关系【转】

转自:http://blog.chinaunix.net/uid-25968088-id-3426027.html 原文地址:Linux 编程中的API函数和系统调用的关系 作者:up哥小号   API:(Application Programming Interface,应用程序编程接口)  指的是我们用户程序编程调用的如read(),write(),malloc(),free()之类的调用的是glibc库提供的库函数.API直接提供给用户编程使用,运行在用户态.  我们经常说到的POSIX(