|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
[C++] capire se in un preciso momento un tasto e' premuto
come da titolo, in c++, come faccio a sapere in un dato momento se un tasto (es CTRL) e' premuto (anche in una finestra diversa da quella del programma) ?
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 1792
|
Sistema operativo? Compilatore?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Apr 2007
Messaggi: 263
|
Non saprei,
forse potresti riuscirci con directinput?? |
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
[Edit] Questo metodo non funziona con il Ctrl+Alt+Canc, intercettarlo è un pò più complicato. Non è C++ ma semplicemente C, visto che si deve lavorare direttamente con le Win32 Codice:
HHOOK hKeyboardHook;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION && hookKey)
{
if (p->vkCode == VK_CONTROL)
//...
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}
int DLL_EXP WINAPI SetKeyboardHook(BOOL setHook)
{
if (setHook)
{
if (!hKeyboardHook)
{
hKeyboardHook =SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,
hInst, 0);
if (!hKeyboardHook)
return 0;
}
return 1;
}
else
{
UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = NULL;
return 0;
}
}
|
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
![]() comunque ti spiego meglio il mio problema: devo inviare delle frasi alla tastiera tramite SendInput... so gia' come fare, ma il problema e' che se mentre il testo viene inviato l'utente sta premendo ctrl (o alt, o entrambi), questo testo non verra' scritto ma verranno eseguite delle azioni (es. copia, incolla, taglia..), mentre se sta premendo shift il testo verra' scritto in maiuscolo quindi io vorrei usare SendInput per rilasciare i tasti premuti, mandare il testo, e poi ripremerli. provo a scrivere qualcosa in pseudo-codice perche' stasera non mi riesce di spiegarmi ![]() Codice:
bool ctrlPressed = false, shiftPressed = false, altPressed = false; if(alt.isPressed()) altPressed=true; if(ctrl.isPressed()) ctrlPressed=true; if(shift.isPressed()) shiftPressed=true; if(altPressed) //rilascia alt if(ctrlPressed) //rilascia ctrl if(shiftPressed) //rilascia shift // invia del codice alla tastiera if(altPressed) //ripremi alt if(ctrlPressed) //ripremi ctrl if(shiftPressed) //ripremi shift |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Se ti serve quando il focus è solamente sulla tua applicazione si può installare l'hook anche senza DLL. Suppongo basti WH_KEYBOARD...
Installarlo dalla DLL serve perché funzioni per tutto il sistema. |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Guarda qui:
http://www.codeguru.com/cpp/w-p/syst...cle.php/c5699/ Su per giù devi fare la stessa cosa. Quando un determinato tasto viene premuto o rilasciato invii dalla dll un messaggio alla tua applicazione che si occuperà di fare le operazioni che servono (se serve solo una sendinput puoi anche richiamarla dalla dll stessa). Come funziona la funzione di callback lo trovi qui: http://msdn2.microsoft.com/en-us/library/ms644985.aspx |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2006
Città: Salerno
Messaggi: 936
|
Quote:
dalla dll come faccio a capire qual e' la mia applicazione? cioe' quali parametri devo dare a FindWindow? Quando uso PostMessage, come faccio ad intercettare (dall'applicazione vera e propria) i dati che la dll mi manda? o semplicemente PostMessage simula un keystroke nella finestra (che posso catturare con getch() ) ? |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Devi passare l'handle alla tua finestra (HWND) ad una funzione della DLL che richiami dalla tua applicazione.
//This function installs the Keyboard hook: KEYDLL3_API void installhook(HWND h); Infatti basta richiamare questa funzione della DLL passandogli l'handle alla finestra della tua applicazione. Il PostMessage serve per inviare un messaggio "utente" (WM_USER + X) alla tua applicazione in base al tipo di messaggio utente agirai di conseguenza. Potrai definire più messaggi utente a seconda del tasto premuto e rilasciato. La tua applicazione può anche essere .Net, ma non mi chiedere come si fa ad intercettare un messaggio utente in una applicazione .Net perché non lo so. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:44.





















