zoukankan      html  css  js  c++  java
  • 判断是否有全屏程序正在运行(C#)

    注册一个AppBar(什么是AppBar?Using Application Desktop Toolbars ),通过SHAppBarMessage向系统注册AppBar,这样,当有程序全屏运行时系统会向我们的程序发送消息,在窗体WndProc中处理即可。

    声明要使用到的API和常量:

    view plaincopy to clipboardprint?
    public class APIWrapper  
        {  
            [DllImport("SHELL32", CallingConvention = CallingConvention.StdCall)]  
            public static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData);  
            [DllImport("User32.dll", CharSet = CharSet.Auto)]  
            public static extern int RegisterWindowMessage(string msg);  
        }  
    [StructLayout(LayoutKind.Sequential)]  
    public struct RECT  
    {  
    public int left;  
    public int top;  
    public int right;  
    public int bottom;  
    }  
    [StructLayout(LayoutKind.Sequential)]  
        public struct APPBARDATA  
        {  
            public int cbSize;  
            public IntPtr hWnd;  
            public int uCallbackMessage;  
            public int uEdge;  
            public RECT rc;  
            public IntPtr lParam;  
        }  
    public enum ABMsg : int 
        {  
            ABM_NEW = 0,  
            ABM_REMOVE,  
            ABM_QUERYPOS,  
            ABM_SETPOS,  
            ABM_GETSTATE,  
            ABM_GETTASKBARPOS,  
            ABM_ACTIVATE,  
            ABM_GETAUTOHIDEBAR,  
            ABM_SETAUTOHIDEBAR,  
            ABM_WINDOWPOSCHANGED,  
            ABM_SETSTATE  
        }  
    public enum ABNotify : int 
        {  
            ABN_STATECHANGE = 0,  
            ABN_POSCHANGED,  
            ABN_FULLSCREENAPP,  
            ABN_WINDOWARRANGE  
        }  
     public enum ABEdge : int 
        {  
            ABE_LEFT = 0,  
            ABE_TOP,  
            ABE_RIGHT,  
            ABE_BOTTOM  
        } 
    public class APIWrapper
        {
            [DllImport("SHELL32", CallingConvention = CallingConvention.StdCall)]
            public static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData);
            [DllImport("User32.dll", CharSet = CharSet.Auto)]
            public static extern int RegisterWindowMessage(string msg);
        }
    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
    public int left;
    public int top;
    public int right;
    public int bottom;
    }
    [StructLayout(LayoutKind.Sequential)]
        public struct APPBARDATA
        {
            public int cbSize;
            public IntPtr hWnd;
            public int uCallbackMessage;
            public int uEdge;
            public RECT rc;
            public IntPtr lParam;
        }
    public enum ABMsg : int
        {
            ABM_NEW = 0,
            ABM_REMOVE,
            ABM_QUERYPOS,
            ABM_SETPOS,
            ABM_GETSTATE,
            ABM_GETTASKBARPOS,
            ABM_ACTIVATE,
            ABM_GETAUTOHIDEBAR,
            ABM_SETAUTOHIDEBAR,
            ABM_WINDOWPOSCHANGED,
            ABM_SETSTATE
        }
    public enum ABNotify : int
        {
            ABN_STATECHANGE = 0,
            ABN_POSCHANGED,
            ABN_FULLSCREENAPP,
            ABN_WINDOWARRANGE
        }
     public enum ABEdge : int
        {
            ABE_LEFT = 0,
            ABE_TOP,
            ABE_RIGHT,
            ABE_BOTTOM
        }  

    在窗口Load事件中注册AppBar:

    view plaincopy to clipboardprint?
    private void RegisterAppBar(bool registered)  
            {  
                APPBARDATA abd = new APPBARDATA();  
                abd.cbSize = Marshal.SizeOf(abd);  
                abd.hWnd = this.Handle;  
                if(!registered)  
                {  
                    //register  
                    uCallBackMsg = APIWrapper.RegisterWindowMessage("APPBARMSG_CSDN_HELPER");  
                    abd.uCallbackMessage = uCallBackMsg;  
                    uint ret = APIWrapper.SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);  
                }  
                else 
                {  
                    APIWrapper.SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);  
                }  
            }  
     private void Form1_Load(object sender, EventArgs e)  
            {  
                this.RegisterAppBar(false);  
            } 
    private void RegisterAppBar(bool registered)
            {
                APPBARDATA abd = new APPBARDATA();
                abd.cbSize = Marshal.SizeOf(abd);
                abd.hWnd = this.Handle;
                if(!registered)
                {
                    //register
                    uCallBackMsg = APIWrapper.RegisterWindowMessage("APPBARMSG_CSDN_HELPER");
                    abd.uCallbackMessage = uCallBackMsg;
                    uint ret = APIWrapper.SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);
                }
                else
                {
                    APIWrapper.SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);
                }
            }
     private void Form1_Load(object sender, EventArgs e)
            {
                this.RegisterAppBar(false);
            }  

    重载窗口消息处理函数:

    view plaincopy to clipboardprint?
    protected override void WndProc(ref System.Windows.Forms.Message m)  
            {  
                if (m.Msg == uCallBackMsg)  
                {  
                    switch (m.WParam.ToInt32())  
                    {  
                        case (int)ABNotify.ABN_FULLSCREENAPP:  
                            {  
                                if ((int)m.LParam == 1)  
                                    this.RunningFullScreenApp = true;  
                                else 
                                    this.RunningFullScreenApp = false;  
                                break;  
                            }  
                        default:  
                            break;  
                    }  
                }  
                base.WndProc(ref m);  
            } 
    protected override void WndProc(ref System.Windows.Forms.Message m)
            {
                if (m.Msg == uCallBackMsg)
                {
                    switch (m.WParam.ToInt32())
                    {
                        case (int)ABNotify.ABN_FULLSCREENAPP:
                            {
                                if ((int)m.LParam == 1)
                                    this.RunningFullScreenApp = true;
                                else
                                    this.RunningFullScreenApp = false;
                                break;
                            }
                        default:
                            break;
                    }
                }
                base.WndProc(ref m);
            }

    在程序退出时,不要忘了Unregister我们注册的AppBar:

    view plaincopy to clipboardprint?
    this.RegisterAppBar(true); 
    this.RegisterAppBar(true);

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jingzhongrong/archive/2010/03/16/5385951.aspx

    作者:观海看云个人开发历程知识库 - 博客园
    出处:http://www.cnblogs.com/zhangtao/
    文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    力扣算法:组合总和IV
    力扣算法:组合总和III
    逻辑回归(Logistic Regression)学习笔记
    力扣算法:组合总和II
    力扣算法:组合总和
    寒假作业(五)
    寒假作业(四)
    寒假作业(三)
    寒假作业(二)
    寒假学习(一)
  • 原文地址:https://www.cnblogs.com/zhangtao/p/1691906.html
Copyright © 2011-2022 走看看