comment détecter si le mode Aero Peek est activé

J’essaie de savoir comment détecter si le mode Windows Aero Peek est activé. En particulier, je dois détecter si le contenu de ma fenêtre est affiché ou dessiné comme un cadre avec un arrière-plan transparent. Je sais que je peux exclure ma fenêtre d’Aero Peek, mais ce n’est pas ce dont j’ai besoin en ce moment.

TIA

votre ordinateur ira dans ce mode ” Aero Peek ” lorsque l’utilisateur jette un œil sur Windows en passant la souris sur les icons de la barre des tâches. Vous pouvez utiliser le crochet d’événement windows pour tracer si l’object ” Task Switcher ” est affiché, combiné avec le mode DWM, il devrait vous indiquer si l’utilisateur regarde une fenêtre. Voici une application que j’ai faite pour tester cette idée (c ++, faites-moi savoir s’il y a des problèmes pour la convertir en c #).

#include  #include  #include  #include  #include  #include  #define THREAD_MESSAGE_EXIT WM_USER + 2000 HWINEVENTHOOK eventHook; HWND taskSwitcherHwnd = 0; // process event void CALLBACK HandleWinEvent(HWINEVENTHOOK hook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime) { if (event == EVENT_OBJECT_SHOW) { IAccessible* pAcc = NULL; VARIANT varChild; HRESULT hr = AccessibleObjectFromEvent(hwnd, idObject, idChild, &pAcc, &varChild); if (hr == S_OK && pAcc != NULL) { BSTR accName; pAcc->get_accName(varChild, &accName); if (wcscmp(accName, L"Task Switcher")==0) { std::cout << "Aero Peek on\n"; taskSwitcherHwnd = hwnd; } SysFreeString(accName); pAcc->Release(); } } else if (event == EVENT_OBJECT_HIDE && taskSwitcherHwnd!=0 && taskSwitcherHwnd==hwnd) { std::cout << "Aero Peek off\n"; taskSwitcherHwnd = 0; } } // thread proc for messages processing // needed for event's hook to work DWORD WINAPI TreadProc(LPVOID n) { std::cout << "InitializeEventHook\n"; CoInitialize(NULL); eventHook = SetWinEventHook( EVENT_OBJECT_SHOW, EVENT_OBJECT_HIDE, NULL, HandleWinEvent, 0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { if (msg.message==THREAD_MESSAGE_EXIT) { break; } else { TranslateMessage(&msg); DispatchMessage(&msg); } } std::cout << "ShutdownEventHook\n"; UnhookWinEvent(eventHook); CoUninitialize(); return 0; } int _tmain(int argc, _TCHAR* argv[]) { std::cout << "Detect Aero Peek\n"; DWORD threadId; int value = 0; HANDLE hThread = CreateThread( NULL, 0, TreadProc, &value, 0, &threadId); char a; std::cin >> a; PostThreadMessage(threadId, THREAD_MESSAGE_EXIT, 0, 0); WaitForSingleObject(hThread, 10000); CloseHandle(hThread); return 0; } 

espère que cela aide, regarde

Est-ce ce que vous êtes après?

  [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."); } } 

Si vous lisez à partir du registre Windows, vous pouvez y trouver le statut de Aero Peek

\ HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ DWM

Est une valeur DWORD nommée EnableAeroPeek définie comme suit:

1 = activé 0 = désactivé

Comparez simplement à 0 ou 1 pour savoir si AeroPeek est activé.

En C # quelque chose comme ça:

 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"); 

Vous pouvez également modifier ces valeurs et le statut d’Aero Peek changera instantanément.