I'm trying to find out how to detect if windows desktop Aero Peek mode is on. In particular I'm need to detect if my window content is shown or drawn as a frame with transparent background. I know I can exclude my window from Aero Peek, but this not what I need at this moment.
TIA
your desktop would go into this "Aero Peek" mode when user is peeking windows by hovering mouse over taskbar icons. You can use windows event hook to trace if "Task Switcher" object is shown, combined with DWM mode on it should tell you if user is peeking a window. Below is an application I made to test this idea (c++, let me know if there are problems converting it to c#).
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <objbase.h>
#include <Oleacc.h>
#include <iostream>
#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;
}
hope this helps, regards