Hogyan lehet engedélyezni a nagybetűs másik folyamatban

Hogyan lehet engedélyezni a nagybetűs másik folyamatban?

mondjuk a forma egy pár gomb és egy időzítő 100 ms.
Most az időzítő kód, amely mozog a hangsúly a gombokat:

eljárás Tmform.Timer1Timer (Sender: TObject);
kezdődik
PostMessage (fogantyú, WM_KEYDOWN, VK_TAB, 0);
PostMessage (fogantyú, WM_KEYUP, VK_TAB, 0);
végén;

Segítségével WM_CHAR ha nem csinál semmit.

De ezt a kódot, sikeresen a kurzort a szöveg elejére Jegyzettömb:

var h, hm, tid, CTID: THandle;
# XA0; # XA0; ks: TKeyboardstate;
kezdődik
hm: = GetForegroundWindow;
CTID: = GetCurrentThreadId ();
tid: = GetWindowThreadProcessId (hm);
ha tid <> CTID majd 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);
md [VK_CONTROL]: = $ 00;
SetKeyboardState (KS);
ha tid <> CTID majd AttachThreadInput (CTID, tid, hamis);
végén;

Lehetséges és SendMessage - hat a jegyzettömb (lásd [42].). A legfontosabb dolog, hogy ez valahogy működik SetKeyboardState, és ennek megfelelően meg lehet csinálni, mert bármilyen kombinációja.

SetKeyboardState korlátozások:
Változások e táblázat nem érintik billentyűzet bármely más téma.
.
Mivel a SetKeyboardState funkció megváltoztatja a bemeneti állapot a hívó szálat, és nem a globális input a rendszer állapotát, az alkalmazás nem tudja használni SetKeyboardState beállítani a NUM LOCK, a CAPS LOCK, vagy Scroll Lock (vagy a japán Kana) jelzőfények a billentyűzeten .
.

Ie ez nem vezet változásokat clavier bejegyzést egy másik téma. # XA0, mert ez, ami AttachInput. Emellett - nem változik az állam a gombokat, a teljes a teljes rendszer (például * Lock).

> Ezen felül - ez nem változtatja meg az állam a kulcsok közös
> A teljes rendszer (mint például a * Lock).

próbálni. Ha ez igaz, a program csak reagál PostMessage (és ez is lehetne) - hívások között SetKeyboardState kell adni neki munkát kapott üzeneteket (a legegyszerűbb - a Sleep). Mivel PostMessage üzeneteket küldeni a patak egyszerre, de ezek valószínűleg feldolgozása befejezése után a kód (beleértve az összes SetKeyboardState hívások).

jaj # 9786;. Ismét hibák érdekel?

Milyen értelemben? SetKeyboardState prések CAPS LOCK a jelenlegi folyamat. Csakúgy, mint bármelyik másik gombot.

> Igazából fordította, ő fények ezeket a gombokat
> Nem tartalmazhat.

> Lehetséges, hogy valami az ő másik folyamat?

Azt próbálja beszivárog.

> Prések, ez a program nem megvalósítható (abban az értelemben, fizikai
> Press).

Milyen jogon nem értett, amit mondok?

> Ez a funkció az állapot e kulcsfontosságú, mert a hívó
> áramlás

És én közel azonos. Ezért nem világos, milyen a viselkedése SetKeyboardState érzékelni a telepítés állapotát CAPS LOCK más, mint a többi kulcsot.

Ez nem a ház, és a szinkronizálás bemenet, és a feldolgozási folyamatot Magic „a.

KS [VK_CONTROL]: = $ 80;
SetKeyboardState (KS);
PostMessage (VK_HOME.);
Sleep (200); // mágikus kezelni kell Ctrl-Home kombináció
md [VK_CONTROL]: = $ 00;
SetKeyboardState (KS);

A téma nagyon érdekes. Bár tudtam, ha dolgozik, a billentyűzet a vonalon úgy döntöttem, hogy próbálja ki / be villanykörte Kapslok. Az óra tárgyalás kaptam az alábbi kódot:
keybd_event (VK_CAPITAL, 0,0,0);
keybd_event (VK_CAPITAL, 0, KEYEVENTF_KEYUP, 0);
állapota megváltozik Kapslok megfordult.
A popovodu kombinációja, például a Ctrl + A, írásban táblák:
Press (vagy egyéb módon emulált) Ctrl
nyomja meg az A
kiadás A
engedje Ctrl
vagy keybd_event (az aktív program), vagy PostMessage (egyes programok).

Bocs, ha az üzenet nem a témát.

Nemrég olvastam ezt a szálat, hogy elfelejtettem megkérdezni erről.
Úgy tűnik, hogy a válasz erre a témára, és a Ctrl + A felesleges.

AttachThreadInput szükséges, mert anélkül, hogy ez működni fog SetKeyboardState

szinte. $ helyett FF # XA0, ez szükséges, hogy a 81 $ vagy 80 $. Ebben az állapotban megfelel a legmagasabb bites kulcs - megnyomásakor / nincs lenyomva, és az alacsony - olyan állapot, egy korábbi időben (azaz használt több GetKeyboardState).

Próbáld meg alvás nélkül:

kezdődik
hm: = GetForegroundWindow;
CTID: = GetCurrentThreadId ();
tid: = GetWindowThreadProcessId (hm, PID);
ha tid <> CTID majd AttachThreadInput (CTID, tid, true);
hProcess: = OpenProcess (SYNCHRONISE, hamis, PID);
h: = getFocus;
GetKeyboardState (KS);
KS [VK_CONTROL]: = $ 81;
SetKeyboardState (KS);
PostMessage (h, WM_KEYDOWN, VK_HOME, 0);
PostMessage (h, WM_KEYUP, VK_HOME, 0);
ha hProcess <> 0, akkor WaitForInputIdle (hProcess, 500)
# XA0; mást alvás (500);
md [VK_CONTROL]: = $ 00;
SetKeyboardState (KS);
ha tid <> CTID majd AttachThreadInput (CTID, tid, hamis);
CloseHandle (hProcess);
végén;

További optimalizálás hProcess kaphat a program indításakor, például, ha a mágikus végigmenni CreateProcess.

Újra meg újra - az első lehetőség nem őrzi is regisztrálja.

Mielőtt a magyar betűk kell, hogy valóban váltani rasskladku, de tehet anélkül keybd_event:

PostMessage (hwnd, WM_INPUTLANGCHANGEREQUEST, 0, $ 419); // váltani ru
PostMessage (hwnd, WM_INPUTLANGCHANGEREQUEST, 0, $ 409); // váltani eng

Mintegy WaitForInputIdle - hatására visszatér? Ha megpróbáljuk feldolgozni egy hiba, hogy nyissa PROCESS_ALL_ACCESS.

Ami a nyilvántartásban:

KS [VK_SHIFT]: = $ 81;
SetKeyboardState (KS);
PostMessage (hwnd, WM_CHAR, Ord ( "A"), 0);
Sleep (500);
md [VK_SHIFT]: = $ 00;
SetKeyboardState (KS);
PostMessage (hwnd, WM_CHAR, Ord ( "b"), 0);
Sleep (500);

SendMessage (hWindow, WM_INPUTLANGCHANGE, $ CC, KBD);
És KBD lehet átalakul. Fő - $ CC - a nyelv másutt pechatataet és az orosz és angol nyelven.

Nagyon praktikus és nyom. kódot. Csak akkor kell nagybetűk továbbítja. Én általában tesz egy kis szünet 5 - hiánya inkább a jegyzetfüzetbe.

d: = 5;
KS [vk_shift]: = KS [vk_shift] vagy $ 80;
SetKeyboardState (KS);
PostMessage (h, WM_KEYDOWN, Ord ( "A"), 0);
Sleep (d);
KS [vk_shift]: = KS [vk_shift] és $ 7F;
SetKeyboardState (KS);
Sleep (d);
PostMessage (h, WM_KEYDOWN, Ord ( "Q"), 0);
Sleep (d);

Ha behelyez egy időzítő felvezető nyomtatott: „AqAqAqAq”

Memória: 0.8 MB
Idő: 0,097 c