C#實現(xiàn)老板鍵功能的代碼
更新時間:2015年05月18日 09:34:32 投稿:hebedich
最近在做項目中遇到需要增加個老板鍵功能,找一慣的方式,開始從網(wǎng)絡下手尋找: 關鍵字類似”C# 老板鍵“,一搜,一堆又一堆,然而出來的代碼大多數(shù)都不是太合適,下面給大家分享下自己的解決方案已經(jīng)一個網(wǎng)友的解決方案,有需要的小伙伴可以參考下。
C#設置熱鍵隱藏指定窗口的代碼
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];
}
}
}
}
再給大家分享一個其他網(wǎng)友的方法,也非常不錯,詳情請看注釋。
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace drmaple
{
class HotKey
{
//如果函數(shù)執(zhí)行成功,返回值不為0。
//如果函數(shù)執(zhí)行失敗,返回值為0。要得到擴展錯誤信息,調用GetLastError。
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(
IntPtr hWnd, //要定義熱鍵的窗口的句柄
int id, //定義熱鍵ID(不能與其它ID重復)
KeyModifiers fsModifiers, //標識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時才會生效
Keys vk //定義熱鍵的內容
);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(
IntPtr hWnd, //要取消熱鍵的窗口的句柄
int id //要取消熱鍵的ID
);
//定義了輔助鍵的名稱(將數(shù)字轉變?yōu)樽址员阌谟洃?,也可去除此枚舉而直接使用數(shù)值)
[Flags()]
public enum KeyModifiers
{
None = 0,
Alt = 1,
Ctrl = 2,
Shift = 4,
WindowsKey = 8
}
}
}
//簡單說明一下:
//“public static extern bool RegisterHotKey()”這個函數(shù)用于注冊熱鍵。由于這個函數(shù)需要引用user32.dll動態(tài)鏈接庫后才能使用,并且
//user32.dll是非托管代碼,不能用命名空間的方式直接引用,所以需要用“DllImport”進行引入后才能使用。于是在函數(shù)前面需要加上
//“[DllImport("user32.dll", SetLastError = true)]”這行語句。
//“public static extern bool UnregisterHotKey()”這個函數(shù)用于注銷熱鍵,同理也需要用DllImport引用user32.dll后才能使用。
//“public enum KeyModifiers{}”定義了一組枚舉,將輔助鍵的數(shù)字代碼直接表示為文字,以方便使用。這樣在調用時我們不必記住每一個輔
//助鍵的代碼而只需直接選擇其名稱即可。
//(2)以窗體FormA為例,介紹HotKey類的使用
//在FormA的Activate事件中注冊熱鍵,本例中注冊Shift+S,Ctrl+Z,Alt+D這三個熱鍵。這里的Id號可任意設置,但要保證不被重復。
private void Form_Activated(object sender, EventArgs e)
{
//注冊熱鍵Shift+S,Id號為100。HotKey.KeyModifiers.Shift也可以直接使用數(shù)字4來表示。
HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S);
//注冊熱鍵Ctrl+B,Id號為101。HotKey.KeyModifiers.Ctrl也可以直接使用數(shù)字2來表示。
HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
//注冊熱鍵Alt+D,Id號為102。HotKey.KeyModifiers.Alt也可以直接使用數(shù)字1來表示。
HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
}
//在FormA的Leave事件中注銷熱鍵。
private void FrmSale_Leave(object sender, EventArgs e)
{
//注銷Id號為100的熱鍵設定
HotKey.UnregisterHotKey(Handle, 100);
//注銷Id號為101的熱鍵設定
HotKey.UnregisterHotKey(Handle, 101);
//注銷Id號為102的熱鍵設定
HotKey.UnregisterHotKey(Handle, 102);
}
重載FromA中的WndProc函數(shù)
///
/// 監(jiān)視Windows消息
/// 重載WndProc方法,用于實現(xiàn)熱鍵響應
///
///
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
//按快捷鍵
switch (m.Msg)
{
case WM_HOTKEY:
switch (m.WParam.ToInt32())
{
case 100: //按下的是Shift+S
//此處填寫快捷鍵響應代碼
break;
case 101: //按下的是Ctrl+B
//此處填寫快捷鍵響應代碼
break;
case 102: //按下的是Alt+D
//此處填寫快捷鍵響應代碼
break;
}
break;
}
base.WndProc(ref m);
}
以上所述就是本文的全部內容了,希望對大家學習C#能夠有所幫助。
相關文章
C#使用iTextSharp獲取PDF文件書簽信息的操作方法
C# iTextSharp是一個用于處理PDF文件的源庫,它提供了一系列的功能,包括創(chuàng)建PDF文件,以及提取和操作PDF文件中的內容,本文給大家介紹了C#使用iTextSharp獲取PDF文件書簽信息的操作方法,需要的朋友可以參考下2024-04-04
c#讀取excel數(shù)據(jù)的兩種方法實現(xiàn)
這篇文章主要介紹了c#讀取excel數(shù)據(jù)的兩種方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12

