2012-10-18 21 views
5

È necessario immettere un carattere in una cella di una griglia Delphi a livello di codice (in un'altra applicazione).Simulazione dell'input da tastiera in Delphi utilizzando WinAPI

Per fare questo manualmente, sono richiesti seguenti operazioni:

  1. Premere il tasto F3.
  2. Premere il tasto freccia destra 3 volte.
  3. Premere il pulsante Spazio.
  4. Digitare la lettera "E" sulla tastiera.
  5. Premere il tasto freccia destra.

    // Press F3 button   
    keybd_event(VK_F3, 0, 0, 0);   
    // Press right arrow key 3 times 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    
    // Press the space button 
    keybd_event(VK_SPACE, 0, 0, 0); 
    
    // Type letter E 
    keybd_event(Ord('E'), 0, 0, 0); 
    
    // Move to the right 
    keybd_event(VK_RIGHT, 0, 0, 0); 
    

Ma non funziona. Quando eseguo questo codice, nulla sembra accadere.

Come devo modificare questo codice in modo che simuli effettivamente l'input dell'utente?

+0

Ho fatto qualcosa su ['tastiera virtuale'] (http://stackoverflow.com/a/12565963/960757) qualche tempo fa (e ce ne saranno molti altri). Ma per il tuo problema, se stai bersagliando 'TStringGrid', penso che non puoi fare altro che focalizzarlo e simulare le tue battute (se ricordo bene,' TStringGrid' non risponde a nessun tipo di messaggio che essere in grado di impostare il testo di una cella). – TLama

+0

In questa particolare applicazione è possibile inserire valori in quella griglia solo tramite tastiera. L'ho già fatto con AutoHotKey e MS UI Automation, ma ora devo riscrivere questo codice in Delphi. –

+0

Non posso contare sulla messa a fuoco della griglia perché esiste un programma sul sistema di destinazione, che si attiva ogni 200 millisecondi. –

risposta

9

Ogni pressione di un tasto è un tasto in basso e quindi un tasto in alto. Quindi hai bisogno di due chiamate allo keybd_event per la pressione di un tasto. Ad esempio, per premere F3:

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0); 
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0); 

Nota che KEYEVENTF_KEYDOWN non è in realtà definita dai file di intestazione di Windows, o la traduzione di Delphi. Definirlo come 0. Rende il codice più chiaro scritto in modo esplicito però.

Ovviamente non si sporcherà il codice con le chiamate abbinate a keybd_event. Ma invece dovresti riassumere le chiamate abbinate in una funzione di aiuto.

È possibile che in alcune situazioni sia necessario specificare il secondo parametro, il codice di scansione. Ma spesso non è necessario.

+0

Grazie. 'Keybd_event' funziona, quando il controllo in questione NON è focalizzato? –

+0

@DmitriPisarenko Non è così. I messaggi di input vanno al controllo con il focus di input. –

+0

È possibile sostituire le chiamate di 'keybd_event' con l'invio di messaggi di Windows alla griglia? –