zoukankan      html  css  js  c++  java
  • 通过热键隐藏/显示窗口

    通过热键隐藏/显示窗口,以前看到用钩子做过,下面的这个方法也好像挺好的
    using System;
    using System.Text;
    using System.Collections;
    using System.Runtime.InteropServices;

    namespace WindowHider
    {
    /// <summary>
    /// Object used to control a Windows Form.
    /// </summary>
    public class Window
    {
    /// <summary>
    /// Win32 API Imports
    /// </summary>
    [DllImport("user32.dll")] private static extern
    bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll")] private static extern
    bool SetForegroundWindow(IntPtr hWnd);
    [DllImport("user32.dll")] private static extern
    bool IsIconic(IntPtr hWnd);
    [DllImport("user32.dll")] private static extern
    bool IsZoomed(IntPtr hWnd);
    [DllImport("user32.dll")] private static extern
    IntPtr GetForegroundWindow();
    [DllImport("user32.dll")] private static extern
    IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
    [DllImport("user32.dll")] private static extern
    IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);

    /// <summary>
    /// Win32 API Constants for ShowWindowAsync()
    /// </summary>
    private const int SW_HIDE = 0;
    private const int SW_SHOWNORMAL = 1;
    private const int SW_SHOWMINIMIZED = 2;
    private const int SW_SHOWMAXIMIZED = 3;
    private const int SW_SHOWNOACTIVATE = 4;
    private const int SW_RESTORE = 9;
    private const int SW_SHOWDEFAULT = 10;

    /// <summary>
    /// Private Fields
    /// </summary>
    private IntPtr m_hWnd;
    private string m_Title;
    private bool m_Visible = true;
    private string m_Process;
    private bool m_WasMax = false;

    /// <summary>
    /// Window Object's Public Properties
    /// </summary>
    public IntPtr hWnd
    {
    get{return m_hWnd;}
    }
    public string Title
    {
    get{return m_Title;}
    }
    public string Process
    {
    get{return m_Process;}
    }

    /// <summary>
    /// Sets this Window Object's visibility
    /// </summary>
    public bool Visible
    {
    get{return m_Visible;}
    set
    {
    //show the window
    if(value == true)
    {
    if(m_WasMax)
    {
    if(ShowWindowAsync(m_hWnd,SW_SHOWMAXIMIZED))
    m_Visible = true;
    }
    else
    {
    if(ShowWindowAsync(m_hWnd,SW_SHOWNORMAL))
    m_Visible = true;
    }
    }
    //hide the window
    if(value == false)
    {
    m_WasMax = IsZoomed(m_hWnd);
    if(ShowWindowAsync(m_hWnd,SW_HIDE))
    m_Visible = false;
    }
    }
    }

    /// <summary>
    /// Constructs a Window Object
    /// </summary>
    /// <param name="Title">Title Caption</param>
    /// <param name="hWnd">Handle</param>
    /// <param name="Process">Owning Process</param>
    public Window(string Title, IntPtr hWnd, string Process)
    {
    m_Title = Title;
    m_hWnd = hWnd;
    m_Process = Process;
    }

    //Override ToString()
    public override string ToString()
    {
    //return the title if it has one, if not return the process name
    if (m_Title.Length > 0)
    {
    return m_Title;
    }
    else
    {
    return m_Process;
    }
    }

    /// <summary>
    /// Sets focus to this Window Object
    /// </summary>
    public void Activate()
    {
    if(m_hWnd == GetForegroundWindow())
    return;

    IntPtr ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow(),
    IntPtr.Zero);
    IntPtr ThreadID2 = GetWindowThreadProcessId(m_hWnd,IntPtr.Zero);

    if (ThreadID1 != ThreadID2)
    {
    AttachThreadInput(ThreadID1,ThreadID2,1);
    SetForegroundWindow(m_hWnd);
    AttachThreadInput(ThreadID1,ThreadID2,0);
    }
    else
    {
    SetForegroundWindow(m_hWnd);
    }

    if (IsIconic(m_hWnd))
    {
    ShowWindowAsync(m_hWnd,SW_RESTORE);
    }
    else
    {
    ShowWindowAsync(m_hWnd,SW_SHOWNORMAL);
    }
    }
    }

    /// <summary>
    /// Collection used to enumerate Window Objects
    /// </summary>
    public class Windows : IEnumerable, IEnumerator
    {
    /// <summary>
    /// Win32 API Imports
    /// </summary>
    [DllImport("user32.dll")] private static extern
    int GetWindowText(int hWnd, StringBuilder title, int size);
    [DllImport("user32.dll")] private static extern
    int GetWindowModuleFileName(int hWnd, StringBuilder title, int size);
    [DllImport("user32.dll")] private static extern
    int EnumWindows(EnumWindowsProc ewp, int lParam);
    [DllImport("user32.dll")] private static extern
    bool IsWindowVisible(int hWnd);

    //delegate used for EnumWindows() callback function
    public delegate bool EnumWindowsProc(int hWnd, int lParam);

    private int m_Position = -1; // holds current index of wndArray,
    // necessary for IEnumerable

    ArrayList wndArray = new ArrayList(); //array of windows

    //Object's private fields
    private bool m_invisible = false;
    private bool m_notitle = false;

    /// <summary>
    /// Collection Constructor with additional options
    /// </summary>
    /// <param name="Invisible">Include invisible Windows</param>
    /// <param name="Untitled">Include untitled Windows</param>
    public Windows(bool Invisible, bool Untitled)
    {
    m_invisible = Invisible;
    m_notitle = Untitled;

    //Declare a callback delegate for EnumWindows() API call
    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
    //Enumerate all Windows
    EnumWindows(ewp, 0);
    }
    /// <summary>
    /// Collection Constructor
    /// </summary>
    public Windows()
    {
    //Declare a callback delegate for EnumWindows() API call
    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow);
    //Enumerate all Windows
    EnumWindows(ewp, 0);
    }
    //EnumWindows CALLBACK function
    private bool EvalWindow(int hWnd, int lParam)
    {
    if (m_invisible == false && !IsWindowVisible(hWnd))
    return(true);

    StringBuilder title = new StringBuilder(256);
    StringBuilder module = new StringBuilder(256);

    GetWindowModuleFileName(hWnd, module, 256);
    GetWindowText(hWnd, title, 256);

    if (m_notitle == false && title.Length == 0)
    return(true);

    wndArray.Add(new Window(title.ToString(), (IntPtr)hWnd,
    module.ToString()));

    return(true);
    }

    //implement IEnumerable
    public IEnumerator GetEnumerator()
    {
    return (IEnumerator)this;
    }
    //implement IEnumerator
    public bool MoveNext()
    {
    m_Position++;
    if (m_Position < wndArray.Count)
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    public void Reset()
    {
    m_Position = -1;
    }
    public object Current
    {
    get
    {
    return wndArray[m_Position];
    }
    }
    }
    }

  • 相关阅读:
    欧拉回路
    2018 年 ACM-ICPC 焦作站现场赛感受
    3.1 基础-抛小球
    2.2 进阶-禁忌雷炎
    初学Java-循环输入直到文件结束
    1.1 基础-取近似值
    1.2 进阶-对称的二叉树
    LEETCODE
    算法
    算法
  • 原文地址:https://www.cnblogs.com/tuyile006/p/598949.html
Copyright © 2011-2022 走看看