Comunicarea prin SendKeys

Instrucțiunea SendKeys este o formă de comunicare de bază și limitată între aplicații.

Puteți găsi SendKeys utile dacă nici automatizare, nici DDE nu funcționează cu aplicația țintă. Dar SendKeys are neajunsuri, după veți vedea mai jos.

SendKeys transmite apăsările de taste specificate la aplicația de destinație. Se dă drept cineva care apasă taste la tastatură.

De exemplu, pentru a utiliza SendKeys poate trimite comanda pentru a crea un fișier nou în Notepad, prin trimiterea apăsărilor de taste pentru Alt+F, N (pentru a executa comanda Fișier > Nou), iar Notepad reacționează ca și cum ați fi apăsat manual tastele. În aplicațiile Office 2016, Alt+F deschide fila Fișier din Panglică. SendKeys funcționează numai cu aplicații Windows care rulează în prezent: Nu puteți utiliza SendKeys pentru a porni o altă aplicație care rulează (pentru că trebuie să utilizați comanda Shell, așa s-a discutat mai devreme în acest capitol), și nici nu puteți utiliza SendKeys pentru a comunica cu aplicații DOS care le execută într-o mașină DOS virtuală sub Windows. Sintaxa pentru instrucțiunea SendKeys este următoarea:

SendKeys string[, wait]

Aici, string este o expresie necesară de tip String care specifică intrarile de la tastatura care urmează să fie trimise la aplicația de destinație. wait este o valoare booleană opțională care specifică dacă să se aștepte după trimiterea intrarilor de la tastatura până când aplicația le-a executat (True) sau să revină imediat la controlul procedurii de trimitere a intrarilor de la tastatura (False, setarea implicită). Setarea True, cu toate acestea, poate preveni unele tipuri de probleme de sincronizare.

De obicei, string constă dintr-o serie de intrări de la tastatura (nu doar o singură apăsare de tastă). Toate caracterele alfanumerice care apar pe tastatura obișnuită sunt reprezentate de acele caractere: Pentru a trimite litera H, specificați H în șir și pentru a trimite cuvântul Salut, specificați Salut în string. Pentru a desemna tastele de mișcare (săgeată) și editare, SendKeys utilizează cuvinte cheie închise în cadrul acoladelor ({}), așa cum este descris în tabelul următor.

Pentru a trimite tastele Shift, Control și Alt, utilizați simbolurile afișate în tabelul următor.

SendKeys atribuie automat apăsarea tastei după tasta meta la tasta meta, imitând astfel apăsarea și ținerea apăsată a tastei Alt — de exemplu, apăsând simultan S.

Cu alte cuvinte, pentru a trimite o combinație Ctrl+O apăsare de taste, specificați AO, iar SendKeys imită ținerea apăsată a tastei Ctrl în timp ce apăsați tasta O. Apoi, următoarea apăsare de tastă după O este considerat a fi apăsată separat. Dacă trebuie să atribuiți mai multe apăsări de taste pentru tasta meta, introduceți intrarile de la tastatură între paranteze după meta tastă. De exemplu, pentru a trimite Alt+F, I, I, se scrie %(FII), nu %FII.

După puteți vedea, SendKeys are utilizări speciale pentru semnul plus (+), caret (A), semn procentual (%) și paranteze (). De asemenea, Tilda (~) are un tratament special. Pentru a utiliza aceste caractere în locul utilizărilor lor speciale, introduceți-le în cadrul acoladelor: {=} trimite semnul = , {^} trimite caracterul ^obișnuit, {%} trimite un semn procentual, {~} trimite tilda și {()} trimite paranteze. De asemenea, trebuie să se anexeze paranteze (care au o semnificație specială în DDE în unele aplicații) în cadrul acoladelor; chiar și acoladele se încadrează între acolade.

Utilizarea SendKeys este mai puțin complexă decât pare; încă un truc pe care ar trebui să îl știți: pentru a repeta o tastă, introduceți tasta și numărul de repetări între acolade. De exemplu, pentru a trimite cinci apăsări ale tastei săgeată în sus, specificați {UP 5}; pentru a trimite 10 zerouri, specificați {0 10}.

Codul de mai jos arată un exemplu de utilizare a SendKeys pentru a trimite un text către Notepad după ce l-ați început cu comanda Shell.

AVERTISMENTE DESPRE SENDKEYS

SendKeys este o tehnologie veche, și are două dezavantaje grave. În primul rând, puteți avea probleme de sincronizare. SendKeys a fost creat atunci când computerele erau mult mai lente decât azi. Din acest motiv, în anumite circumstanțe, executarea codului de mai jos creează o problemă atunci când se afișează caseta de dialog Save . Executarea se oprește, nu se termină salvarea fișierelor. Sau, numele de fișier este salvat ca fi sier urnal, în loc de fișier jurnal. Astea sunt probleme de sincronizare. Al doilea dezavantaj se referă la testarea codului. Deoarece SendKeys trebuie să activeze aplicația țintă, nu îl puteți trece prin codul dvs. Editorul doar preia focalizare înapoi la punctul greșit, devine perplex, și intrarile trimise de la tastatură sunt aruncate în Editor, în loc de Notepad. Trebuie să executați procedura fie din VBA Editor (apăsând F5), fie din aplicația gazdă ca o macrocomandă. Din punct de vedere tehnic, acest al doilea comportament - absorbirea intrarilor de la tastatură în Editor, în loc de Notepad este rezultat a ceea ce face SendKeys: adaugă intrările de la tastatură în tampon (bufferul) pentru taste a computerului. Apoi se întorc unde pot.

Automatizarea Notepad cu SendKeys

1.    Sub Trimite_la_Notepad()
2.    Dim strLogDate As String
3.    Dim strSaveLog As String
4.    Dim strMsg As String
5.    Dim appNotepad As Variant
6.    strMsg = "Exemplu de text jurnal aici."
7.    strLogDate = Month(Now) & & Day(Now) & & Year(Now)
8.    strSaveLog = "Log file for " & strLogDate & ".txt" 
9.    appNotepad = Shell("notepad.exe", vbNormalFocus)
10.  AppActivate appNotepad
11.  SendKeys strMsg & "%FS" & strSaveLog & "{Enter}" & "%{F4}", True
12.  End Sub

Iată funcționează codul:

  • Procedura Trimite_la_Notepad începe prin declararea (în liniile 2, 3 și 4) trei variabile String—strLogDate, strSaveLog și strMsg—și (pe linia 5) o variabilă de tip Variant, appNotepad.
  • Linia 6 atribuie la strMsg un șir de text eșantion.
  • Linia 7 atribuie la strLogDate o dată construită cu valorile Day, Month și Year pentru Now (care returnează data și ora curente). De exemplu, dacă data este July 11, 2016, Month(Now) va returna 7, Day(Now) va returna 11, iar Year(Now) va returna 2016, deci șirul strLogDate va conține 7-11-2016.
  • Linia 8 atribuie la șirul strSaveLog (care vor fi utilizate pentru a furniza numele fișierului pentru fișierul jurnal) text care descrie fișierul, șirul strLogDate, și extensia.txt (numele fișierului va fi Log file for 7-11-2016.txt).
  • În linia 9, procedura ajunge în partea de jos, utilizând instrucțiunea Shell pentru a executa Notepad într-o fereastră "normală" (nu maximizată sau minimizată) cu focalizare și stocarea ID-ul de activitate a sesiunii Notepad în variabila appNotepad.
  • Linia 10 folosește o instrucțiune AppActivate pentru a activa Notepad.
  • Linia 11 folosește o instrucțiune SendKeys pentru a trimite la Notepad următoarele:
  • Informațiile conținute în variabila șir strMsg.
  • Apăsarea de taste Alt=F (pentru a deschide meniul File), urmată de apăsarea tastei S pentru a alege elementul Save din meniu. Această apăsare de tastă afișează caseta de dialog Save As cu caseta text File Name fișier selectată.
  • Variabila șir strSaveLog, care este introdus în caseta text Nume fișier.
  • Apăsarea tastei Enter pentru a alege butonul Save din caseta de dialog Save As.
  • Apăsarea tastelor Alt=F4 pentru a închide Notepad.
  • Linia 12 închide procedura.

Când executați această procedură (din nou, amintiți-vă că pentru a rula procedura aveți nevoie să apăsați tasta F5, în loc de tasta F8 – pas cu pas), veți vedea următoarele:

1. Este deschis Notepad.

2. Apare conținutul șirului Msg în fereastra Notepad.

3. Este afișată caseta de dialog Save As, completează numele fișierului în câmpul text File Name, apoi se închide.

4. Se închide aplicația Notepad. Fișierul .txt este salvat în folderul activ curent de pe hard disk.

(Pentru a localiza folderul activ în prezent, deschideți Notepad manual și alegeți Fișier > Salvare ca. De asemenea, este posibil să constatați că problemele de temporizare au modificat numele fișierului din Log file for 1-13-2016.txt în ceva de tipul g file for 1-13-2016.txt)

Deoarece SendKeys a fost folosit cel mai des pentru a deschide meniurile unei aplicații și pentru a selecta o opțiune din meniuri (modul în care încă se comportă cu Notepad), ați putea crede că aplicațiile de la Vista - care sunt în mare parte fără meniu și utilizează Panglica în schimb — ar reduce serios flexibilitatea tehnicii SendKeys. Cu toate acestea, acest lucru nu este adevărat. Multe dintre caracteristicile Panglicii, de exemplu, sunt accesibile prin intermediul combinațiilor de taste. Încercați să apăsați secvența Alt, W, Q, 2 și tasta Enter în Word; va comuta la fila View din Panglică, va selecta opțiunea Zoom și va trece la un zoom de 200%.

Diferența aici este că, în loc de a utiliza abordarea tradițională de apăsare simultană tasta Alt în timp ce apăsarea altor taste (cum ar fi Alt + V pentru a deschide un meniu Vizualizare), în sistemele de operare Windows curent apăsați și eliberați Alt și apoi apăsați tasta W pentru a comuta la fila Vizualizare din Panglică. În acest moment, sunt posibile apăsări de taste suplimentare pentru a activa diferitele opțiuni din fila Vizualizare. Pentru a ieși din acest mod, apăsați Esc.

Iată un alt exemplu de cod, care ilustrează modul de manipulare a aplicațiilor bazate pe panglică. De data aceasta ținta este Excel și este manipulată Panglica. Codul trimite o tastă Alt (aceasta activează caracteristica taste de comandă rapidă de pe Panglică și bara de instrumente Acces rapid, afișând o varietate de taste din care puteți alege). Apoi, codul comută la fila Vizualizare (un W face asta), iar în cele din urmă este activat modul ecran complet trimițând un E:

Sub Trimite_la_Excel()
  Dim appExcel As Variant
  appExcel = Shell("Excel.exe", vbNormalFocus)
  AppActivate appExcel
    SendKeys "%", True 'trimite tasta Alt 
  SendKeys "W", True 'W pentru fila View 
  SendKeys "E", True 'E pentru modul full screen (ecran întreg)
End Sub

Înainte de a apăsa tasta F5 pentru a testa codul, închideți Excel.