cs_rt15
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
26 avril 2009 à 13:29
"Si c'était possible on pourrait se retrouver
avec des fenêtres qui bataillent pour être topmost et bloquer le pc. Du
genre "si je ne suis plus devant, me mettre devant" qui déclanche le
"si je ne suis plus devant, me mettre devant" de l'autre et ainsi de
suite."
Bah vi ça peut rentrer en conflit avec une application existante... Mais bon, n'est ce pas ce que tu veux au final, que ce soit ton application qui soit au premier plan quitte à batailler avec le reste du monde ?
Cette application s'arrange pour être la seule topmost. C'est mal codé (timer...) mais c'est suffisant pour faire des essais. Globalement, cela supprime le caractère top most de toutes les fenêtres sauf de la fenêtre courante. Cela fonctionne sur des applications classique. Je n'ai pas essayé avec un jeu.
<hr size="2" width="100%" />#ifdef UNICODE
#define _UNICODE
#endif /* UNICODE */
#include <windows.h>
#include <tchar.h>
#define TIMER_ID 1
#define BUFFER_SIZE 1024
HINSTANCE _hThisInstance; /* Handle du module */
HWND _hWnd; /* Handle de la fenêtre */
LPTSTR _lpAppName = _T("StayOnTop"); /* Nom de l'appli */
HDESK _hDesk; /* Handle sur le desktop */
/**
* Affiche un message d'erreur correspondant à la dernière erreur Win32
*/
DWORD __stdcall ShowLastError()
{
DWORD nLastError; /* Numéro de l'erreur */
LPTSTR lpMessageBuffer; /* Récupération du message */
nLastError = GetLastError();
/* Formatage du message */
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL, nLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(void*)&lpMessageBuffer, 0, NULL);
/* Affichage du message */
MessageBox(NULL, lpMessageBuffer, _T("ERROR"), MB_OK | MB_ICONERROR);
LocalFree(lpMessageBuffer);
return nLastError;
}
/**
* Call back appelée pour toutes les fenêtres
*/
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
if (IsWindowVisible(hwnd) && (hwnd != _hWnd))
SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE);
return TRUE;
}
/**
* Traitement des messages
*/
LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
int bHandled; /* Pour savoir si le message est traité */
long nResult;
nResult = 0;
bHandled = 0;
switch (nMessage)
{
case WM_TIMER:
EnumDesktopWindows(_hDesk, EnumWindowsProc, 0);
bHandled = 1;
break;
case WM_DESTROY:
/* On signale que le thread va s'arrêter */
PostQuitMessage(0);
bHandled = 1;
break;
}
if (! bHandled)
nResult = DefWindowProc(hWnd, nMessage, wParam, lParam);
return nResult;
}
/**
* Initialise la fenêtre principale de l'appli.
*/
int __stdcall CreateMyWindow()
{
WNDCLASSEX wincl; /* Classe de la fenêtre utilisée */
int nResult;
nResult = 0;
/* Création de la classe de fenêtre */
wincl.cbSize = sizeof(WNDCLASSEX);
wincl.style = 0;
wincl.lpfnWndProc = WindowProcedure;
wincl.cbClsExtra = 0;
wincl.cbWndExtra = 0;
wincl.hInstance = _hThisInstance;
wincl.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wincl.hCursor = LoadCursor(NULL, IDC_ARROW);
wincl.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wincl.lpszMenuName = 0;
wincl.lpszClassName = _lpAppName;
wincl.hIconSm = NULL;
/* Enregistrement de la classe */
if (! RegisterClassEx(&wincl)) goto the_end;
/* Création de la fenêtre */
_hWnd = CreateWindowEx(WS_EX_TOPMOST,
_lpAppName, _lpAppName,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 300,
HWND_DESKTOP, NULL, _hThisInstance, NULL);
if (! _hWnd) goto the_end;
/* Affichage de la fenêtre */
ShowWindow (_hWnd, SW_SHOW);
nResult = 1;
the_end:
return nResult;
}
/**
* Main
*/
int __cdecl WinMainCRTStartup()
{
MSG messages; /* Messages envoyés à l'application */
int nResult;
/* Récupération du handle du module */
_hThisInstance = GetModuleHandle(NULL);
/* Récupération d'un handle sur le desktop (CloseDesktop pas nécessaire) */
_hDesk = GetThreadDesktop(GetCurrentThreadId());
if (! CreateMyWindow())
{
nResult = ShowLastError();
goto the_end;
}
/* Création du timer */
if (! SetTimer(_hWnd, TIMER_ID, 100, NULL))
{
nResult = ShowLastError();
goto the_end;
}
/* Boucle de traitement des messages */
while (GetMessage(&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
nResult = messages.wParam;
the_end:
/* ExitProcess nécessaire car sinon c'est un ExitThread */
ExitProcess(nResult);
/* Pour esquiver le warning */
return 0;
}