C#判断是否有全屏程序正在运行

本文介绍如何利用C#的API调用来检测是否有全屏程序正在运行。通过注册 AppBar 并监听特定消息,可以判断系统中是否存在全屏应用,并据此设置程序状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

 

  1. public class APIWrapper   
  2.     {   
  3.         [DllImport("SHELL32", CallingConvention = CallingConvention.StdCall)]   
  4.         public static extern uint SHAppBarMessage(int dwMessage, ref APPBARDATA pData);   
  5.         [DllImport("User32.dll", CharSet = CharSet.Auto)]   
  6.         public static extern int RegisterWindowMessage(string msg);   
  7.     }   
  8. [StructLayout(LayoutKind.Sequential)]   
  9. public struct RECT   
  10. {   
  11. public int left;   
  12. public int top;   
  13. public int right;   
  14. public int bottom;   
  15. }   
  16. [StructLayout(LayoutKind.Sequential)]   
  17.     public struct APPBARDATA   
  18.     {   
  19.         public int cbSize;   
  20.         public IntPtr hWnd;   
  21.         public int uCallbackMessage;   
  22.         public int uEdge;   
  23.         public RECT rc;   
  24.         public IntPtr lParam;   
  25.     }   
  26. public enum ABMsg : int  
  27.     {   
  28.         ABM_NEW = 0,   
  29.         ABM_REMOVE,   
  30.         ABM_QUERYPOS,   
  31.         ABM_SETPOS,   
  32.         ABM_GETSTATE,   
  33.         ABM_GETTASKBARPOS,   
  34.         ABM_ACTIVATE,   
  35.         ABM_GETAUTOHIDEBAR,   
  36.         ABM_SETAUTOHIDEBAR,   
  37.         ABM_WINDOWPOSCHANGED,   
  38.         ABM_SETSTATE   
  39.     }   
  40. public enum ABNotify : int  
  41.     {   
  42.         ABN_STATECHANGE = 0,   
  43.         ABN_POSCHANGED,   
  44.         ABN_FULLSCREENAPP,   
  45.         ABN_WINDOWARRANGE   
  46.     }   
  47.  public enum ABEdge : int  
  48.     {   
  49.         ABE_LEFT = 0,   
  50.         ABE_TOP,   
  51.         ABE_RIGHT,   
  52.         ABE_BOTTOM   
  53.     }  

 

 

在窗口Load事件中注册AppBar:

 

  1. private void RegisterAppBar(bool registered)   
  2.         {   
  3.             APPBARDATA abd = new APPBARDATA();   
  4.             abd.cbSize = Marshal.SizeOf(abd);   
  5.             abd.hWnd = this.Handle;   
  6.             if(!registered)   
  7.             {   
  8.                 //register   
  9.                 uCallBackMsg = APIWrapper.RegisterWindowMessage("APPBARMSG_优快云_HELPER");   
  10.                 abd.uCallbackMessage = uCallBackMsg;   
  11.                 uint ret = APIWrapper.SHAppBarMessage((int)ABMsg.ABM_NEW, ref abd);   
  12.             }   
  13.             else  
  14.             {   
  15.                 APIWrapper.SHAppBarMessage((int)ABMsg.ABM_REMOVE, ref abd);   
  16.             }   
  17.         }   
  18.  private void Form1_Load(object sender, EventArgs e)   
  19.         {   
  20.             this.RegisterAppBar(false);   
  21.         }  

 

 

重载窗口消息处理函数:

 

  1. protected override void WndProc(ref System.Windows.Forms.Message m)   
  2.         {   
  3.             if (m.Msg == uCallBackMsg)   
  4.             {   
  5.                 switch (m.WParam.ToInt32())   
  6.                 {   
  7.                     case (int)ABNotify.ABN_FULLSCREENAPP:   
  8.                         {   
  9.                             if ((int)m.LParam == 1)   
  10.                                 this.RunningFullScreenApp = true;   
  11.                             else  
  12.                                 this.RunningFullScreenApp = false;   
  13.                             break;   
  14.                         }   
  15.                     default:   
  16.                         break;   
  17.                 }   
  18.             }   
  19.             base.WndProc(ref m);   
  20.         }  

 

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

 

  1. this.RegisterAppBar(true);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值