Problema dll con imput tastiera e output finestra

di il
2 risposte

Problema dll con imput tastiera e output finestra

Buona sera a tutti.
Sono un nuovo iscritto programmatore principiante , scrivo generalmente moduli aggiuntivi (dll) per applicazioni e programmini per micro controllori.
Ho un problema con un modulo dll che visualizza un menu in una finestra e prende l'input dalla tastiera tipo 0 , 1 , 2 , 3 , 4 .
il modulo viene eseguito quando inserisco l'oggetto ad esso associato nell'applicazione.
Se inserisco un solo modulo funziona bene ma se ne inserisco 2 o più l'input e l'output funzionano solo nel primo inserito.
Per l'output ho più o meno risolto cosi:

hwnd = GetForegroundWindow();
TextOut(GetDC(hwnd), 20, 20, L"Topolino", strlen("Topolino"));

e scrive nella finestra selezionata.
Ma per l'input non so come fare il tasto premuto viene intercettato solo dal primo modulo inserito ma io vorrei andasse al modulo con la finestra
in primo piano.

#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

if (KEYDOWN(0x31) || KEYDOWN(0x61)) {
while (!KEYUP(0x31) || !KEYUP(0x61));
TextOut(GetDC(hwnd), 40, 20, L"Pippo", strlen("Pippo"));
// Qui vorrei che il modulo con la finestra in primo piano facesse una determinata cosa
// ma questa if entra sempre nel primo modulo inserito
fflush(stdin);
}

molte grazie
e saluti a tutti

2 Risposte

  • Re: Problema dll con imput tastiera e output finestra

    Io imposterei così:
    
    #include <cstdlib>
    #include <cstdio>
    #include <winuser.h>
    
    using namespace std;
    
    bool key_event[254];
    
    void key_task_in() {
        static bool key_down[254] = {false};
        for(char i = 0x30; i <= 0x69; i == 0x39 ? i = 0x60 : i++){
            if(!key_down[i] && GetAsyncKeyState(i) & 0x8000)
                key_down[i] = true;
            if(key_down[i] && !(GetAsyncKeyState(i) & 0x8000)){
                key_event[i] = true;
                key_down[i] = false;
            }
        }
    }
    
    void key_task_out() {
        for(char i = 0x30; i <= 0x69; i == 0x39 ? i = 0x60 : i++){
            if(key_event[i]){
                if(i <= 0x39)
                    printf(" ---> evento %c\n", i);
                else
                    printf(" ---> evento keypad %c\n", i - 0x30);                
                key_event[i] = false;
            }
        }
        fflush(stdout);
    }
    
    int main(int argc, char** argv) {   
        while(1){
           key_task_in(); 
           key_task_out();      
           /* altri task */
        }
        return 0;
    }
    
    Poi i key_event te li instradi tu verso i vari moduli, a seconda delle necessità

    p.s.: fflush(stdin) è undefined behavior
  • Re: Problema dll con imput tastiera e output finestra

    Grazie per la cortese risposta.
    Il tuo codice se non ho capito male permette di individuare i tasti premuti , ma una volta individuato il taso per far eseguire una determinata
    operazione al modulo desiderato risponde solo il primo modulo.
    Il programma dove sto facendo le prove è un CAD/Simulatore elettronico e i moduli sono un componente elettronico la dll simula il comportamento
    di questo componente , la stessa dll gestisce tutti i moduli inseriti che elettricamente lavorano bene ma riesco a inviare i messaggi alle varie
    finestre (una per ogni modulo inserito) usando il loro identificativo, mentre l'operazione comandata dal tasto viene eseguita solo dal primo modulo
    che forse risulta essere quello attivo pero non so come attivare gli altri non ho esempi disponibili.
    Cordiali saluti
Devi accedere o registrarti per scrivere nel forum
2 risposte