Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803

    [c] gestire eventi tastiera

    salve, sto cercando di fare un programmino per gestire il mouse da tastiera,
    per ora ho trovato la funzione SetCursorPos di windows.h, che imposta il corsore date le coordinate
    ora come faccio ad intercettare gli eventi della tastiera? (es: tasto A decrementa x, tasto D incrementa x, W incrementa y, ecc)

    ps: ovviamente sono su winxp

  2. #2
    GetAsincKeyState/GetKeyboardState
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    Originariamente inviato da MItaly
    GetAsincKeyState/GetKeyboardState
    si avevo trovato GetAsyncKeyState ma credo di non aver capito come funziona..
    ho letto che prende il keycode ma non funziona
    esempio
    void controlla_tastiera(){
    if (GetAsyncKeyState(49)) SetCursorPos(1200, 1200);
    }

    inoltre c'è un modo di intercettare l'evento senza fare necessariamente un while infinito?
    anche mettendo una sleep 10ms nel while non credo sia il caso di tenere per tutto l'utilizzo del programma la cpu al 100%

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    225
    in una applicazione console ti devi per forza trovare in un loop
    codice:
    ....
    int finito = 0;
    
    while ( ! finito ) {
    
      mostraInterfaccia ();
      
      char ch = acquisisciCarattere ();  // dipende dal sistema operativo
      
      switch ( ch ) {
        case 4 :
           finito = 1;
           break;
        default :
           break;
      }
    
    }
    
    ...
    
    return (0);

  5. #5
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    si il ciclo è inevitabile è chiaro a questo punto
    sono arrivato a questo punto..
    due problemi:
    1. la parte di attiva/disattiva ascolto non funziona (è quella commentata)
    2. non so come gestire il click (ovviamente vorrei che premendo un tasto simulasse il click del mouse)
    MOUSEEVENT_LEFTDOWN non mi viene riconosciuto che libreria deve essere inclusa?

    Codice PHP:
    #include <windows.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include <iostream>

    int x=100;
    int y=100;
    bool active true;
    void controlla_tastiera(){
        
    //if(active){
         //if (GetAsyncKeyState(53)<0) {active=false;}
         //if (GetAsyncKeyState(54)<0) {active=true;}
         
         
    if (GetAsyncKeyState(49)) {
                                     
    x-=20;
                                     
    SetCursorPos(x,y);
                                     }
         if (
    GetAsyncKeyState(50)) {
                                     
    y-=20;
                                     
    SetCursorPos(x,y);
                                     }
         if (
    GetAsyncKeyState(51)) {
                                     
    x+=20;
                                     
    SetCursorPos(x,y);
                                     }
         if (
    GetAsyncKeyState(52)) {
                                     
    y+=20;
                                     
    SetCursorPos(x,y);
                                     }
         
         
         
         
          if(
    GetAsyncKeyState(VK_NUMPAD0))
     (

     
    mouse_event(MOUSEEVENT_LEFTDOWNxy100100));

     }


     }  
         
         
    //}
    }

    int main() {
       while(
    1){
                 
    controlla_tastiera();
                 
    Sleep(30);}



  6. #6
    Originariamente inviato da ant_alt
    si avevo trovato GetAsyncKeyState ma credo di non aver capito come funziona..
    ho letto che prende il keycode ma non funziona
    esempio
    void controlla_tastiera(){
    if (GetAsyncKeyState(49)) SetCursorPos(1200, 1200);
    }
    Non è così semplice... leggiti la sua documentazione.
    inoltre c'è un modo di intercettare l'evento senza fare necessariamente un while infinito?
    anche mettendo una sleep 10ms nel while non credo sia il caso di tenere per tutto l'utilizzo del programma la cpu al 100%
    L'alternativa è una hook globale, ma devi essere piuttosto ferrato nella programmazione win32.
    Una sleep di 10 ms basta e avanza a tenere l'utilizzo della CPU praticamente fisso sullo 0%.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    risolto, la costante si chiama MOUSEEVENTF_LEFTDOWN
    c'era un errore nel forum dove l'ho presa


    @mitaly il codice postato sembra funzionare..che non sia elegante chissenefrega
    mi interessa solo gestire il mouse col telecomando
    qualcuno ha capito xke non viene modificata correttamente la variabile bool active?

  8. #8
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    altro quesito:
    facendo un pò di testing (se così si può chiamare )
    ho notato che è necessario scegliere tasti che interagiscano il meno possibile con windows

    c'è qualcuno che mi sfugge oltre crtl e shift?

  9. #9
    Originariamente inviato da ant_alt
    @mitaly il codice postato sembra funzionare..che non sia elegante chissenefrega
    mi interessa solo gestire il mouse col telecomando
    Ripensandoci nel tuo caso va bene così, mi ricordavo male alcune particolarità di GetAsincKeyState.
    qualcuno ha capito xke non viene modificata correttamente la variabile bool active?
    codice:
    if (GetAsyncKeyState(53)<0) {active=false;}
    Perché "<0"? Fai come in tutti gli altri if, altrimenti il blocco viene eseguito solo se il tasto è premuto nell'esatto momento del controllo.
    Tra l'altro questo
    codice:
    if (GetAsyncKeyState(54)<0) {active=true;}
    va messo fuori dal blocco if(active), altrimenti una volta disattivato non sarà più possibile riattivarlo.

    Ah, un consiglio, invece di usare coordinate assolute usa e SetCursorPos usa mouse_event e coordinate relative, in modo che il tuo sistema funzioni bene anche se usato insieme ad un mouse e così che si inserisca ad un livello più basso nella gestione del mouse di Windows (mouse_event simula effettivamente lo spostamento del mouse, mentre SetCursorPos cambia solamente la posizione del cursore).
    ho notato che è necessario scegliere tasti che interagiscano il meno possibile con windows
    Puoi usare il tastierino numerico con Bloc Num disattivato (VK_NUMPAD0-VK_NUMPAD9) (lista virtual key codes).

    Un'ultima cosa: questa applicazione esiste già ed è inclusa in Windows sotto Accesso facilitato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente bannato
    Registrato dal
    Feb 2004
    Messaggi
    2,803
    - il controllo <0 funziona esattamente uguale, perchè da quel che ho letto sia KeyDown che KeyPressed restituiscono short minore di 0, in effetti mi interesserebbe, se possibile, distinguere i due casi..ma stampando lo short restituito da GetAsyncKeyState() di qualunque tasto mi escono 4 numeri uguali

    - per la questione dell'active no comment (vò a frustarmi forte)

    - per mouse_event sarei felice di affinare il codice se tu mi dicessi come

    - l'applicazioni di cui parli in accesso facilitato non funziona associata al telecomando credo si tratti proprio di incompatibilità di segnali (fa quasi impressione parlare di segnali su windows eh ) perchè su 4 direzioni 3 funzionano e una no

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.