Cum se activează litere mari într-un alt proces

Cum se activează litere mari într-un alt proces?

să presupunem că pe formularul are câteva butoane și un contor de timp de 100 ms.
Acum, codul timer care se va muta focalizarea pe butoanele:

Procedura Tmform.Timer1Timer (Expeditor: TObject);
începe
PostMessage (mâner, WM_KEYDOWN, VK_TAB, 0);
PostMessage (mâner, WM_KEYUP, VK_TAB, 0);
se încheie;

Utilizarea WM_CHAR atunci când nu face nimic.

Dar acest cod, se mută cu succes cursorul la începutul textului în Notepad:

var h, hm, tid, ctid: THandle;
# XA0; # XA0; ks: TKeyboardstate;
începe
hm: = GetForegroundWindow;
ctid: = GetCurrentThreadId ();
tid: = GetWindowThreadProcessId (hm);
dacă tid <> ctid apoi AttachThreadInput (ctid, tid, true);
h: = GetFocus;
fillchar (ks, sizeof (TKeyboardState), 0);
ks [VK_CONTROL]: = $ 80;
SetKeyboardState (ks);
SendMessage (h, WM_KEYDOWN, VK_HOME, 0);
SendMessage (h, WM_KEYUP, VK_HOME, 0);
ks [VK_CONTROL]: = $ 00;
SetKeyboardState (ks);
dacă tid <> ctid apoi AttachThreadInput (ctid, tid, false);
se încheie;

Posibilele și SendMessage - acționează pe Notepad (vezi [42].). Principalul lucru pe care aceasta funcționează într-un fel SetKeyboardState, și în consecință, este posibil să se facă, deoarece orice combinație.

limitări SetKeyboardState:
Modificările aduse acestui tabel nu afectează de intrare tastatura în orice alt fir.
.
Deoarece funcția SetKeyboardState modifică starea de intrare a firului de asteptare si nu starea de intrare globală a sistemului, o aplicație nu poate utiliza SetKeyboardState pentru a seta NUM LOCK, CAPS LOCK sau SCROLL LOCK (sau Kana japonez) indicator luminos de pe tastatură .
.

Ie aceasta nu duce la intrarea modificări Clavier într-un alt fir. # XA0, pentru aceasta și cauza AttachInput. În plus - nu se schimba starea tastelor, totalul pentru întregul sistem (cum ar fi * Lock).

> În plus față de acest lucru - nu se schimba starea tastelor comune
> Întregul sistem (cum ar fi * Lock).

încercați. Dacă este adevărat programul răspunde numai la PostMessage (și acest lucru ar putea fi bine) - între apeluri SetKeyboardState trebuie să dea munca ei au primit mesaje (cele mai simple - de somn). Deoarece PostMessage pentru a trimite mesaje în fluxul dintr-o dată, dar acestea sunt probabil prelucrate după finalizarea codului (inclusiv toate apelurile SetKeyboardState).

aoleu # 9786;. Din nou, erori de îngrijire?

În ce sens? SetKeyboardState prese CAPS LOCK în procesul curent. Precum și orice altă tastă.

> De fapt, am tradus-o, el se aprinde pe aceste butoane
> Nu poate conține.

> Este posibil să se facă ceva într-o altă lucrare de proces?

Aș încerca să se infiltreze.

> Prese, acest program nu este fezabilă (în sensul fizic
> Press).

Ce drept nu a înțeles a fost, ce spuneam?

> Această funcție poate seta starea acestei taste, pentru chemarea
> flux

Și eu sunt cam la fel. Prin urmare, nu este clar ce SetKeyboardState comportament pentru a sesiza starea de instalare a CAPS LOCK diferit decât cu alte taste.

Nu este carcasa, și o intrare de sincronizare, iar fluxul de procesare Magic „a.

ks [VK_CONTROL]: = $ 80;
SetKeyboardState (ks);
PostMessage (VK_HOME.);
Sleep (200); // Magic trebuie să se ocupe de Ctrl-Home combinație
ks [VK_CONTROL]: = $ 00;
SetKeyboardState (ks);

Subiectul este foarte interesant. Deși am făcut-o atunci când se lucrează cu o tastatură pe linia am decis să încerc on / off lumina bec Kapslok. Pentru ceasul încercării am primit următorul cod:
keybd_event (VK_CAPITAL, 0,0,0);
keybd_event (VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
Modificări de stat Kapslok inversat.
O combinație popovodu, de exemplu, Ctrl + A, Table de scris:
Apăsați (sau în alt mod emulat) Ctrl
apăsați A
O eliberare
de presă Ctrl
sau prin keybd_event (pentru programul activ), sau prin PostMessage (pentru anumite programe).

Ne pare rău dacă mesajul nu este subiect.

Am citit recent acest subiect, că am uitat să întreb despre asta.
Se pare că răspunsul meu la acest subiect, și Ctrl + A de prisos.

AttachThreadInput necesar ca fara ea va funcționa SetKeyboardState

aproape. în loc de $ FF # XA0, este necesar să se utilizeze 81 $ sau $ 80. În această stare corespunde cea mai mare bit cheie - este apăsat / nu este apăsată, iar scăzută - o condiție într-o perioadă anterioară (adică, utilizat pentru mai multe GetKeyboardState).

Incearca sa faci fara somn:

începe
hm: = GetForegroundWindow;
ctid: = GetCurrentThreadId ();
tid: = GetWindowThreadProcessId (hm, pid);
dacă tid <> ctid apoi AttachThreadInput (ctid, tid, true);
hProcess: = OpenProcess (Sincronizaþi, false, pid);
h: = GetFocus;
GetKeyboardState (ks);
ks [VK_CONTROL]: = $ 81 alineatul;
SetKeyboardState (ks);
PostMessage (h, WM_KEYDOWN, VK_HOME, 0);
PostMessage (h, WM_KEYUP, VK_HOME, 0);
dacă hProcess <> 0 apoi WaitForInputIdle (hProcess, 500)
# XA0; somn altceva (500);
ks [VK_CONTROL]: = $ 00;
SetKeyboardState (ks);
dacă tid <> ctid apoi AttachThreadInput (ctid, tid, false);
CloseHandle (hProcess);
se încheie;

Pentru optimizarea în continuare hProcess poate primi programul este pornit, de exemplu, în cazul în care magia rula prin CreateProcess.

Reverificat - prima opțiune nu păstrează chiar să înregistreze.

Înainte de a trimite scrisorile din România au nevoie pentru a comuta într-adevăr rasskladku, dar se poate face fără keybd_event:

PostMessage (hWnd, WM_INPUTLANGCHANGEREQUEST, 0, $ 419); // comuta la ru
PostMessage (hWnd, WM_INPUTLANGCHANGEREQUEST, 0, $ 409); // comuta la eng

Despre WaitForInputIdle - rezultatul se întoarce? Dacă încercați să proceseze o eroare pentru a deschide PROCESS_ALL_ACCESS.

În ceea ce privește registrul:

ks [VK_SHIFT]: = $ 81 alineatul;
SetKeyboardState (ks);
PostMessage (hWnd, WM_CHAR, Ord ( "A"), 0);
Sleep (500);
ks [VK_SHIFT]: = $ 00;
SetKeyboardState (ks);
PostMessage (hWnd, WM_CHAR, Ord ( "b"), 0);
Sleep (500);

SendMessage (hWindow, WM_INPUTLANGCHANGE, $ CC, KBD);
Și KBD poate fi orice transfer. Principal - $ CC - limba inclus în altă parte pechatataet și rusă și engleză.

Foarte funcțional și pistă. cod. Ai nevoie doar de caractere majuscule pentru a transmite. Am pus, de obicei, o pauză în 5 - lipsa tind să Notepad.

d: = 5;
ks [vk_shift]: = ks [vk_shift] sau $ 80;
SetKeyboardState (ks);
PostMessage (h, WM_KEYDOWN, Ord ( "A"), 0);
Sleep (d);
ks [vk_shift]: = ks [vk_shift] și $ 7F;
SetKeyboardState (ks);
Sleep (d);
PostMessage (h, WM_KEYDOWN, Ord ( "Q"), 0);
Sleep (d);

Când introduceți un handler cronometru este imprimat: „AqAqAqAq“

Memorie: 0.8 MB
Timpul: 0,097 c