C# 如何检测Aero Peek模式是否开启

C# 如何检测Aero Peek模式是否开启,c#,windows,pinvoke,aero,peek,C#,Windows,Pinvoke,Aero,Peek,我正在尝试找出如何检测windows桌面模式是否打开。特别是,我需要检测我的窗口内容是否显示或绘制为具有透明背景的框架。我知道我可以从Aero Peek中排除我的窗口,但这不是我现在需要的 TIA这就是你想要的吗 [DllImport("dwmapi.dll", PreserveSig = false)] public static extern bool DwmIsCompositionEnabled(); public bool IsAeroActive()

我正在尝试找出如何检测windows桌面模式是否打开。特别是,我需要检测我的窗口内容是否显示或绘制为具有透明背景的框架。我知道我可以从Aero Peek中排除我的窗口,但这不是我现在需要的


TIA这就是你想要的吗

    [DllImport("dwmapi.dll", PreserveSig = false)]
    public static extern bool DwmIsCompositionEnabled();

    public bool IsAeroActive()
    {
        // Check if Aero is enabled;
        if (DwmIsCompositionEnabled())
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        bool aeroEnabled = IsAeroActive();

        if (aeroEnabled)
        {
            MessageBox.Show("Aero is enabled.");
        }
        else
        {
            MessageBox.Show("Aero is disabled.");
        }
    }

当用户将鼠标悬停在任务栏图标上查看窗口时,您的桌面将进入这种“Aero Peek”模式。如果显示了“任务切换器”“对象,您可以使用来跟踪,并结合其上的DWM模式,它应该会告诉您用户是否正在窥视窗口。下面是我用来测试这个想法的一个应用程序(c++,如果在将其转换为c#时遇到问题,请告诉我)

#包括
#包括
#包括
#包括
#包括
#包括
#定义线程\u消息\u退出WM\u用户+2000
HWINEVENTHOOK事件挂钩;
HWND taskSwitcherHwnd=0;
//过程事件
无效回调HandleWinEvent(HWINEVENTHOOK钩子、DWORD事件、HWND HWND、,
长idObject,长idChild,
DWORD dwEventThread,DWORD dwmsEventTime)
{
如果(事件==事件\对象\显示)
{
IAccessible*pAcc=NULL;
变异瓦尔柴尔德;
HRESULT hr=AccessibleObjectFromEvent(hwnd、idObject、idChild、pAcc和varChild);
如果(hr==S_OK&&pAcc!=NULL)
{
BSTR账户名称;
pAcc->get_accName(varChild和accName);
if(wcscmp(accName,L“任务切换器”)==0)
{
std::cout Release();
}
}
else if(event==event\u OBJECT\u HIDE&&taskSwitcherHwnd!=0&&taskSwitcherHwnd==hwnd)
{

std::cout如果从windows注册表中读取,可以在那里找到Aero Peek的状态

\HKEY\ U当前\用户\软件\ Microsoft\Windows\DWM

是一个名为enableeropeek的DWORD值,设置如下:

1=启用 0=禁用

只需将其与0或1进行比较,即可确定AeroPeek是否处于启用状态

在C#中,类似这样的内容:

Using Microsoft.Win32;


您还可以更改这些值,Aero Peek状态将立即更改。

您可以使用DwmSetIconicThumbnail()吗检查WM_DWMSendictHumbail消息?看你真的需要IsAeroActive方法吗?为什么不直接调用API?你不必有IsAeroActive方法,就像我编写它的方式,以使它更易于阅读谢谢,但这不是我要找的,你的代码检测DWM是否打开,而我试图检测是否打开桌面当前处于Aero Peek模式。如果将鼠标悬停在任务栏按钮上,当弹出窗口缩略图时,表示Aero Peek处于打开状态,则可以启动桌面on@Nadine当且仅当启用DWM合成时,AeroPeek肯定处于启用状态?
Using Microsoft.Win32;
RegistryKey AeroPeek = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\DWM", true);
       if ((int)AeroPeek.GetValue("EnableAeroPeek") == 1)
        {
            MessageBox.Show("Aero Peek is ON");
        }
        else MessageBox.Show("Aero Peek is OFF");