注册一个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

posted on 2010-03-22 20:55  WPF之家  阅读(481)  评论(0编辑  收藏  举报