C#实现老板键功能的代码
C#设置热键隐藏指定窗口的代码
usingSystem; usingSystem.Text; usingSystem.Collections; usingSystem.Runtime.InteropServices; namespaceWindowHider { ///<summary> ///ObjectusedtocontrolaWindowsForm. ///</summary> publicclassWindow { ///<summary> ///Win32APIImports ///</summary> [DllImport("user32.dll")]privatestaticextern boolShowWindowAsync(IntPtrhWnd,intnCmdShow); [DllImport("user32.dll")]privatestaticextern boolSetForegroundWindow(IntPtrhWnd); [DllImport("user32.dll")]privatestaticextern boolIsIconic(IntPtrhWnd); [DllImport("user32.dll")]privatestaticextern boolIsZoomed(IntPtrhWnd); [DllImport("user32.dll")]privatestaticextern IntPtrGetForegroundWindow(); [DllImport("user32.dll")]privatestaticextern IntPtrGetWindowThreadProcessId(IntPtrhWnd,IntPtrProcessId); [DllImport("user32.dll")]privatestaticextern IntPtrAttachThreadInput(IntPtridAttach,IntPtridAttachTo,intfAttach); ///<summary> ///Win32APIConstantsforShowWindowAsync() ///</summary> privateconstintSW_HIDE=0; privateconstintSW_SHOWNORMAL=1; privateconstintSW_SHOWMINIMIZED=2; privateconstintSW_SHOWMAXIMIZED=3; privateconstintSW_SHOWNOACTIVATE=4; privateconstintSW_RESTORE=9; privateconstintSW_SHOWDEFAULT=10; ///<summary> ///PrivateFields ///</summary> privateIntPtrm_hWnd; privatestringm_Title; privateboolm_Visible=true; privatestringm_Process; privateboolm_WasMax=false; ///<summary> ///WindowObject'sPublicProperties ///</summary> publicIntPtrhWnd { get{returnm_hWnd;} } publicstringTitle { get{returnm_Title;} } publicstringProcess { get{returnm_Process;} } ///<summary> ///SetsthisWindowObject'svisibility ///</summary> publicboolVisible { get{returnm_Visible;} set { //showthewindow 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; } } //hidethewindow if(value==false) { m_WasMax=IsZoomed(m_hWnd); if(ShowWindowAsync(m_hWnd,SW_HIDE)) m_Visible=false; } } } ///<summary> ///ConstructsaWindowObject ///</summary> ///<paramname="Title">TitleCaption</param> ///<paramname="hWnd">Handle</param> ///<paramname="Process">OwningProcess</param> publicWindow(stringTitle,IntPtrhWnd,stringProcess) { m_Title=Title; m_hWnd=hWnd; m_Process=Process; } //OverrideToString() publicoverridestringToString() { //returnthetitleifithasone,ifnotreturntheprocessname if(m_Title.Length>0) { returnm_Title; } else { returnm_Process; } } ///<summary> ///SetsfocustothisWindowObject ///</summary> publicvoidActivate() { if(m_hWnd==GetForegroundWindow()) return; IntPtrThreadID1=GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); IntPtrThreadID2=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> ///CollectionusedtoenumerateWindowObjects ///</summary> publicclassWindows:IEnumerable,IEnumerator { ///<summary> ///Win32APIImports ///</summary> [DllImport("user32.dll")]privatestaticextern intGetWindowText(inthWnd,StringBuildertitle,intsize); [DllImport("user32.dll")]privatestaticextern intGetWindowModuleFileName(inthWnd,StringBuildertitle,intsize); [DllImport("user32.dll")]privatestaticextern intEnumWindows(EnumWindowsProcewp,intlParam); [DllImport("user32.dll")]privatestaticextern boolIsWindowVisible(inthWnd); //delegateusedforEnumWindows()callbackfunction publicdelegateboolEnumWindowsProc(inthWnd,intlParam); privateintm_Position=-1;//holdscurrentindexofwndArray, //necessaryforIEnumerable ArrayListwndArray=newArrayList();//arrayofwindows //Object'sprivatefields privateboolm_invisible=false; privateboolm_notitle=false; ///<summary> ///CollectionConstructorwithadditionaloptions ///</summary> ///<paramname="Invisible">IncludeinvisibleWindows</param> ///<paramname="Untitled">IncludeuntitledWindows</param> publicWindows(boolInvisible,boolUntitled) { m_invisible=Invisible; m_notitle=Untitled; //DeclareacallbackdelegateforEnumWindows()APIcall EnumWindowsProcewp=newEnumWindowsProc(EvalWindow); //EnumerateallWindows EnumWindows(ewp,0); } ///<summary> ///CollectionConstructor ///</summary> publicWindows() { //DeclareacallbackdelegateforEnumWindows()APIcall EnumWindowsProcewp=newEnumWindowsProc(EvalWindow); //EnumerateallWindows EnumWindows(ewp,0); } //EnumWindowsCALLBACKfunction privateboolEvalWindow(inthWnd,intlParam) { if(m_invisible==false&&!IsWindowVisible(hWnd)) return(true); StringBuildertitle=newStringBuilder(256); StringBuildermodule=newStringBuilder(256); GetWindowModuleFileName(hWnd,module,256); GetWindowText(hWnd,title,256); if(m_notitle==false&&title.Length==0) return(true); wndArray.Add(newWindow(title.ToString(),(IntPtr)hWnd, module.ToString())); return(true); } //implementIEnumerable publicIEnumeratorGetEnumerator() { return(IEnumerator)this; } //implementIEnumerator publicboolMoveNext() { m_Position++; if(m_Position<wndArray.Count) { returntrue; } else { returnfalse; } } publicvoidReset() { m_Position=-1; } publicobjectCurrent { get { returnwndArray[m_Position]; } } } }
再给大家分享一个其他网友的方法,也非常不错,详情请看注释。
usingSystem; usingSystem.Collections.Generic; usingSystem.Runtime.InteropServices; usingSystem.Windows.Forms; namespacedrmaple { classHotKey { //如果函数执行成功,返回值不为0。 //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。 [DllImport("user32.dll",SetLastError=true)] publicstaticexternboolRegisterHotKey( IntPtrhWnd,//要定义热键的窗口的句柄 intid,//定义热键ID(不能与其它ID重复) KeyModifiersfsModifiers,//标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效 Keysvk//定义热键的内容 ); [DllImport("user32.dll",SetLastError=true)] publicstaticexternboolUnregisterHotKey( IntPtrhWnd,//要取消热键的窗口的句柄 intid//要取消热键的ID ); //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值) [Flags()] publicenumKeyModifiers { None=0, Alt=1, Ctrl=2, Shift=4, WindowsKey=8 } } } //简单说明一下: //“publicstaticexternboolRegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且 //user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上 //“[DllImport("user32.dll",SetLastError=true)]”这行语句。 //“publicstaticexternboolUnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。 //“publicenumKeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅 //助键的代码而只需直接选择其名称即可。 //(2)以窗体FormA为例,介绍HotKey类的使用 //在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。 privatevoidForm_Activated(objectsender,EventArgse) { //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。 HotKey.RegisterHotKey(Handle,100,HotKey.KeyModifiers.Shift,Keys.S); //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。 HotKey.RegisterHotKey(Handle,101,HotKey.KeyModifiers.Ctrl,Keys.B); //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。 HotKey.RegisterHotKey(Handle,102,HotKey.KeyModifiers.Alt,Keys.D); } //在FormA的Leave事件中注销热键。 privatevoidFrmSale_Leave(objectsender,EventArgse) { //注销Id号为100的热键设定 HotKey.UnregisterHotKey(Handle,100); //注销Id号为101的热键设定 HotKey.UnregisterHotKey(Handle,101); //注销Id号为102的热键设定 HotKey.UnregisterHotKey(Handle,102); } 重载FromA中的WndProc函数 /// ///监视Windows消息 ///重载WndProc方法,用于实现热键响应 /// /// protectedoverridevoidWndProc(refMessagem) { constintWM_HOTKEY=0x0312; //按快捷键 switch(m.Msg) { caseWM_HOTKEY: switch(m.WParam.ToInt32()) { case100://按下的是Shift+S //此处填写快捷键响应代码 break; case101://按下的是Ctrl+B //此处填写快捷键响应代码 break; case102://按下的是Alt+D //此处填写快捷键响应代码 break; } break; } base.WndProc(refm); }
以上所述就是本文的全部内容了,希望对大家学习C#能够有所帮助。