PDA

Visualizza la versione completa : [win32] riaccendere il monitor onkeydown


ant_alt
15-11-2009, 18:13
#include <windows.h>
#include<stdio.h>
#include<conio.h>
int main(){

char ch;
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
while(1){
if (GetAsyncKeyState(VK_RETURN)==-32767){
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
break;
}
Sleep(150);
}


return 0;

}


dato che il monitor si riaccende con qualunque tasto (anche il movimento del mouse), credo che la funz SendMessage abbia una specie di sistema di sicurezza per evitare che programmatori maldestri non sappiano più come riaccendere il monitor una volta eseguita..vuoi che dire?

oregon
15-11-2009, 19:07
vuoi che dire?

Vuoi che dire ?

:confused:

Scusa, ma la domanda qual e'?

ant_alt
15-11-2009, 19:25
Originariamente inviato da oregon
Vuoi che dire ?

:confused:

Scusa, ma la domanda qual e'?

:malol:
ultimamente sono dislessico :stordita:

il problema è riaccendere il monitor alla pressione del tasto invio

oregon
15-11-2009, 19:31
Originariamente inviato da ant_alt
il problema è riaccendere il monitor alla pressione del tasto invio

E il codice che hai mostrato cosa dovrebbe fare?

Vorresti usare "solo" il tasto Invio con il tuo programma escludendo questa funzionalità di Windows ? Non capisco ...

ant_alt
15-11-2009, 19:35
Originariamente inviato da oregon
E il codice che hai mostrato cosa dovrebbe fare?


scusami credevo fosse chiaro, avviando il programma lo schermo si spegne, SOLO alla pressione del tasto INVIO dovrebbe riaccendersi.

il problema è che una volta avviato il programma qualunque tasto o movimento del mouse fa riaccendere lo schermo

ESSE-EFFE
15-11-2009, 20:28
if (GetAsyncKeyState(VK_RETURN)==-32767){


Leggiti la documentazione relativa a GetAsyncKeyState. Quel valore di confronto non mi sembra abbia molto senso, prova con:

if (GetAsyncKeyState(VK_RETURN) & 1)

HTH,

oregon
15-11-2009, 20:41
Adesso e' piu' chiaro ma non penserai di bloccare il funzionamento di Windows solamente eseguendo un programma che attende un tasto ...

E' normale che il processo dei messaggi continui a funzionare, a prescindere da quello che fa il tuo programma e quindi vengano comunque inviati i messaggi per riaccedere lo schermo ...

Penso che l'unico modo sarebbe quello di implementare un hook globale e gestire i messaggi per la riaccensione.

ant_alt
15-11-2009, 20:42
Originariamente inviato da ESSE-EFFE
Leggiti la documentazione relativa a GetAsyncKeyState. Quel valore di confronto non mi sembra abbia molto senso, prova con:

if (GetAsyncKeyState(VK_RETURN) & 1)

HTH,

no il problema non è GetAsyncKeyState, l'ho sempre usata così

Bit più significativo: il tasto è stato premuto tra una chiamata e l'altra alla funzione
| Bit meno significativo: il tasto è correntemente premuto
| |
V BIN V HEX DEC (con segno) Significato
0000000000000000 = 0x0000 = 0 Il tasto non è stato premuto né è correntemente premuto
1000000000000000 = 0x8000 = -32768 Il tasto è stato premuto ma ora non lo è più
0000000000000001 = 0x0001 = 1 Il tasto è premuto in questo momento ma non lo è stato
1000000000000001 = 0x8001 = -32767 Il tasto è stato premuto e lo è tuttora

ant_alt
15-11-2009, 20:52
Originariamente inviato da oregon
Adesso e' piu' chiaro ma non penserai di bloccare il funzionamento di Windows solamente eseguendo un programma che attende un tasto ...

E' normale che il processo dei messaggi continui a funzionare, a prescindere da quello che fa il tuo programma e quindi vengano comunque inviati i messaggi per riaccedere lo schermo ...

Penso che l'unico modo sarebbe quello di implementare un hook globale e gestire i messaggi per la riaccensione.


dici che è una cosa complessa?esempi sul web?

se individuassi e catturassi solo quei 2-3 messaggi che nel mio utilizzo pratico solitamente fanno accendere lo schermo quando non vorrei? tipo movimento mouse, tastiera e "fine di un filmato" (dato che non ho idea di che messaggi stia parlando per questo dicevo di individuarli prima)

ESSE-EFFE
15-11-2009, 21:04
no il problema non è GetAsyncKeyState, l'ho sempre usata così
Bit più significativo: il tasto è stato premuto tra una chiamata e l'altra alla funzione


http://msdn.microsoft.com/en-us/library/ms646293(VS.85).aspx

Io leggo che:

If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState.

E comunque:

Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application.

Loading