Salut,
Quelqu'un sait-il si il est possible de detecter :
- la mise en route de l'economiseur d'ecran de windows
- la fin de l'economiseur d'ecran
Merci
Salut,
Quelqu'un sait-il si il est possible de detecter :
- la mise en route de l'economiseur d'ecran de windows
- la fin de l'economiseur d'ecran
Merci
tu veux parler du screen saver ? ou bien quand il éteint l'écran ?
S'agit-il de ton screen saver ? dans ce cas, il s'agit de regarder du coté de ScreenSaverProc
Quelle est la finalité ?
En fait mon application doit detecter la fin de l'economiseur d'écran pour effectuer un certain traitement.
D'avance merci.
j'ai ressussi a detecter la mise en route de l'écran de veille par la fonction
nId = SC_SCREENSAVE
Code : Sélectionner tout - Visualiser dans une fenêtre à part CWnd::OnSysCommand(UINT nID, LPARAM lParam)
Mais pas pour le fin du screen saver.![]()
alors, je sais pas trop ...
deux idées qui me viennent comme ca, mais sans garanties de fonctionnement.
Hooker l'api ScreenSaverProc avec un WH_GETMESSAGE, et intercepter le message WM_DESTROY
Ou du meme genre, un hook sur WH_SHELL, et intercepter HSHELL_WINDOWCREATED pour y loger une nouvelle callback de traitement du ScreenSaverProc et de meme intercepter WM_DESTROY
dans les deux, ils s'agit d'injecter sa dll dans le process du screen saver
Mais bon ... à défaut de savoir s'il y a plus simple ...![]()
Euh ... la je suis pas sur d'y arriver ...
Mais si y a pas plus simple je vais tenter comme ca.
Merci
tiens, je viens de regarder un petit peu, et je pense etre arrivé à une solution
En hookant simplement les messages qui arrivent aux procédurent de traitement de messages, dans le cas où le process se fini par .SCR (pour un screensaver).
Il suffit ensuite d'intercepter le message WM_DESTROY
ca donne une dll qui ressemble à ca :
.def.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 LIBRARY hookMiseEnVeille EXPORTS installeHookProcedure @1 enleveHookProcedure @2restera plus qu'à appeler les fonctions exportées depuis ton executable
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 #include <windows.h> HINSTANCE hMod = 0; HHOOK hhk = 0; int scrProccess = 0; void verifScrProcess() { char buff[264], *c; DWORD len; len = GetModuleFileName(0, buff, 264); c = buff + len - 3; if (_strnicmp(c,"scr",3)) return; scrProccess = 1; } BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID Reserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: hMod = hDll; verifScrProcess(); break; case DLL_PROCESS_DETACH: break; } return 1; } LRESULT CALLBACK myCallWndRetProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode == HC_ACTION) { if (scrProccess) { CWPRETSTRUCT kbStruct = *((CWPRETSTRUCT *)lParam); if (kbStruct.message == WM_DESTROY) { OutputDebugString("Fin de la mise en veille"); } } } return CallNextHookEx(hhk, nCode, wParam, lParam); } #ifdef __cplusplus extern "C" { #endif int __stdcall installeHookProcedure() { if(!hhk) hhk = SetWindowsHookEx(WH_CALLWNDPROCRET, myCallWndRetProc, hMod, 0); return (int) hhk; } void __stdcall enleveHookProcedure() { if(hhk) { UnhookWindowsHookEx(hhk); hhk = 0; } } #ifdef __cplusplus } #endif
![]()
Pour etre sur de s'etre bien compris :
- Mon application n'est pas un economiseur d'ecran.
- Mon application doit detecter la fin de l'economiseur d'ecran de windows pour effectuer un traitement.
Encore merci
on s'est bien compris
ton application devrait donc avoir une dll, comme celle que je viens d'écrire et dont je t'ai mis le code.
Ton application devra lancer la méthode installeHookProcedure au début
A l'endroit où j'ai mis
, la dll devra notifier ton programme qu'elle a detecté la fin de la mise en veille (par exemple en envoyant un message à ton application)
Code : Sélectionner tout - Visualiser dans une fenêtre à part OutputDebugString("Fin de la mise en veille");
Et à la fin, ton application devra désinstaller le hook avec enleveHookProcedure
oki cool
je vais me lancer la dedans lundi je te retiens au courant.
je le dit ou je le dit pas ; allez je le dit pour la 5eme fois
MERCI !![]()
Bon alors en fait j'ai fait une petite bidouille qui marche bien dans mon cas. Mon application est toujours en premier plan et seule la souris peut intéragir avec elle.
Mon application detecte la mise en marche de l'économiseur d'écran
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void Dlg::OnSysCommand(UINT nID, LPARAM lParam) { if(nID == SC_SCREENSAVE)//61760) { TRACE("DEBUG -> STAT SCREEN SAVER"); bEconomiseur = true; } CDialog::OnSysCommand(nID, lParam); }Mon application detecte que la souris a bougé
Et voila ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 BOOL Dlg::PreTranslateMessage(MSG* pMsg) { switch(pMsg->message) { case WM_MOUSEMOVE : //512 : if(bEconomiseur == true) { bEconomiseur = false; TRACE("[DEBUG]On revient de l'ecran de veille"); // !!!! Mon traitement !!! // !!!! Mon traitement !!! } break; } CWnd::PreTranslateMessage(pMsg); return FALSE; }
Bon c'est un peu plus simple mais ca limite son utilisation.
mmmhhh ....
pourquoi pas![]()
pense aussi à tester si la mise en veille a été quittée autrement (par pression sur une touche par exemple)
oui j'y avais penser mais non car :
Mon application est toujours en premier plan et seule la souris peut intéragir avec elle.![]()
Partager