Win32 API 和 程序锁

一、关于系统系统的函数介绍

  1.FindWindow:在桌面的任务栏下获取对应的接口

/// 在桌面窗口列表中寻找与指定条件相符的第一个窗口。
/// </summary>
/// <param name="lpClassName">指向指定窗口的类名。如果 lpClassName 是 NULL,所有类名匹配。</param>
/// <param name="lpWindowName">指向指定窗口名称(窗口的标题)。如果 lpWindowName 是 NULL,所有windows命名匹配。</param>
/// <returns>IntPtr:返回指定窗口句柄</returns>
[DllImport("USER32.DLL", SetLastError = true, CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

  2.ShowWindow:指定窗口的还原方式

  具体拥有的打开参数如下(摘抄自https://www.cnblogs.com/candyzkn/p/4428590.html):
 

#region ShowWindow 方法窗体状态的参数枚举
        /// <summary>
        /// 隐藏窗口并激活其他窗口
        /// </summary>
        public const int SW_HIDE = 0;

        /// <summary>
        /// 激活并显示一个窗口。如果窗口被最小化或最大化,系统将其恢复到原来的尺寸和大小。应用程序在第一次显示窗口的时候应该指定此标志
        /// </summary>
        public const int SW_SHOWNORMAL = 1;

        /// <summary>
        /// 激活窗口并将其最小化
        /// </summary>
        public const int SW_SHOWMINIMIZED = 2;

        /// <summary>
        /// 激活窗口并将其最大化
        /// </summary>
        public const int SW_SHOWMAXIMIZED = 3;

        /// <summary>
        /// 以窗口最近一次的大小和状态显示窗口。此值与SW_SHOWNORMAL相似,只是窗口没有被激活
        /// </summary>
        public const int SW_SHOWNOACTIVATE = 4;

        /// <summary>
        /// 在窗口原来的位置以原来的尺寸激活和显示窗口
        /// </summary>
        public const int SW_SHOW = 5;

        /// <summary>
        /// 最小化指定的窗口并且激活在Z序中的下一个顶层窗口
        /// </summary>
        public const int SW_MINIMIZE = 6;

        /// <summary>
        /// 最小化的方式显示窗口,此值与SW_SHOWMINIMIZED相似,只是窗口没有被激活
        /// </summary>
        public const int SW_SHOWMINNOACTIVE = 7;

        /// <summary>
        /// 以窗口原来的状态显示窗口。此值与SW_SHOW相似,只是窗口没有被激活
        /// </summary>
        public const int SW_SHOWNA = 8;

        /// <summary>
        /// 激活并显示窗口。如果窗口最小化或最大化,则系统将窗口恢复到原来的尺寸和位置。在恢复最小化窗口时,应用程序应该指定这个标志
        /// </summary>
        public const int SW_RESTORE = 9;

        /// <summary>
        /// 依据在STARTUPINFO结构中指定的SW_FLAG标志设定显示状态,STARTUPINFO 结构是由启动应用程序的程序传递给CreateProcess函数的
        /// </summary>
        public const int SW_SHOWDEFAULT = 10;

        /// <summary>
        /// 最小化窗口,即使拥有窗口的线程被挂起也会最小化。在从其他线程最小化窗口时才使用这个参数
        /// </summary>
        public const int SW_FORCEMINIMIZE = 11; 
        #endregion
/// <summary>
        /// 将窗口按指定状态还原
        /// </summary>
        /// <param name="hWnd">窗口显示的句柄</param>
        /// <param name="nCmdShow">显示方式标识</param>
        /// <returns></returns>
        [DllImport("USER32.DLL")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

   3.激活指定窗口

/// <summary>
        /// 激活指定窗口
        /// </summary>
        /// <param name="hWnd">指定窗口句柄</param>
        /// <returns></returns>
        [DllImport("USER32.DLL")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);

 

 

二、附加(关联)使用知识

  1.Mutex:互斥锁。主要用来使进程互斥

Mutex(bool initiallyOwned, string name, out bool createdNew)/Mutex(bool initiallyOwned, string name, out bool createdNew, MutexSecurity mutexSecurity)参数:
initiallyOwned:如果为 true,则给予调用线程已命名的系统互斥体的初始所属权(如果已命名的系统互斥体是通过此调用创建的);否则为 false。
name: 系统互斥体的名称。如果值为 null,则 System.Threading.Mutex 是未命名的。 createdNew: 在此方法返回时,如果创建了局部互斥体(即,如果 name 为 null 或空字符串)或指定的命名系统互斥体,则包含布尔值 true;如果指定的命名系统互斥体已存在,则为false。该参数未经初始化即被传递。 mutexSecurity:一个 System.Security.AccessControl.MutexSecurity 对象,表示应用于已命名的系统互斥体的访问控制安全性。


bool mutexResult;
mutex = new Mutex(true, "WpfApp", out mutexResult);  // false表示已经存在
if (!mutexResult)
{
  // 打开相同进程
}

 

 

 三、关于实用案例

  1.结合上述第一到第三个函数,可以实现重复打开窗口的激活以及激活主体窗口时激活对应的子窗口

public static void ShowRunningWindow(string winname, int OpenType)
        {
            IntPtr hWndPtr = FindWindow(null, winname);
            int hWndPtrNumber = hWndPtr.ToInt32();
            if (hWndPtrNumber != 0)
            {
                ShowWindow(hWndPtr, OpenType);
                SetForegroundWindow(hWndPtr);
            }
        }

 

 

 

 

 

 

、、、

、、、

上一篇:实现登录验证码


下一篇:谷歌官方解读:TensorFlow 2.0 哪些新特性值得关注?