Stránka: 1 z 1
| [ Príspevkov: 23 ] | |
| Autor | Správa |
|---|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
Potrebujem simulovat ctrl+v teda pastnutie textu ale bez clipboardu.
priklad mam text1:='a'; text2:='b'; text3:='c';
zaregistrujem si 3 klavesove skratky v systeme napr ctrl+a, ctrl+b ctrl+c
a teraz potrebujem aby po stlaceni druhej mi napr do otvoreneho notpadu vlozilo text2. Ale nie cez clipboard a simulaciu ctrl+v.
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
no to bude zlozitejsie kedze notepad ma vlastny pamatovy priestor. ale mozes miesto copy paste pouzit simulovanie stlacania klaves cize ak das ctrl+b tak notepadu zasles sequenciu messages wm_char s kodmy stringu v text2 . myslim ze wparam bude obsahovat kod znaku http://msdn.microsoft.com/en-us/library ... 85%29.aspx
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
no lenze ja to potrebujem vseobecne, notpad bol priklad, proste hocico co ma focus tak tam vopcham svoj text. notpad, browser, word hocico, proste simulacia ctrl+v len sa chcem vyhnut clipboardu. Neviem nic take naguglit
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
no ved to je jedno comu to posles, len musis vediet zistit handle(hwnd) toho objektu
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
takze zistit handle focus okna a potom focus komponenty? oh 
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
bingo, skus getForegroundwindow alebo getActivewindow alebo GetFocus aj komponenta je vacsinou odvodena od window cize na HWND aby mohla preberat messages
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
tak mam to zatial cez clipboard ale ...
ked pastujem cez simulovane ctrl+v tak mi to nechce pastovat cez hotkey kde je ALT, napr ctrl+alt+x
pastujem tymto
Kód: keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0); keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
preco to riesis takto ? chces sa vyhnut zistovaniu handle okna ktoremu to mas poslat ?
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
moc mi to neslo tak som to spravil tak
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
hm, overil si si ci si spravne nasiel handle okna programom SPY++ ?
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
problem nieje v tom ci si najdem handle focus okna ale vtom ze nemam sajnu co dalej  guglim ale nic podobne som nenasiel
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 |
clipboard si asi naplnas cez triedu TClipboard no a ked uz vies handle okna ktore ma urobit paste pomocou SendMessage(handleokna, WM_PASTE, 0, 0); popripade PostMessage(handleokna, WM_PASTE, 0, 0);
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
Kód: procedure paste; var Handle: THandle; begin Handle := GetForegroundWindow; SendMessage(handle, WM_PASTE, 0, 0) end;
len neviem ako zistit handle focus komponenty, nerobil som s tym este
a inak to uz rovno mozem namiesto paste z clipboardu pastnut vlastny text, to by som tiez rad vedel ako
|
|
Registrovaný: 29.10.08 Prihlásený: 30.07.12 Príspevky: 933 Témy: 2 | 2 | |
Registrovaný: 11.01.09 Prihlásený: 26.10.26 Príspevky: 1401 Témy: 10 | 10 Bydlisko: Hrinova |
Možno ti pomôže nejaký príklad:
Kód: var hForWindow, hForControl: HWND; buf: array[0..1023] of byte; procID: integer;
// .....
procedure AddText; var i: integer;
begin
FillChar(buf, 1024, 0); strcopy(@buf, 'toto sa prida do textu'); hForWindow:= GetForegroundWindow(); // zisti handle aktivneho okna procID:= GetWindowThreadProcessID(hForWindow, nil); AttachThreadInput(procID, GetCurrentThreadId(), true); // attachne sa do procesu tohto okna hForControl:= GetFocus(); // zisti handle aktivneho komponentu v tomto okne AttachThreadInput(procID, GetCurrentThreadId(), false); // spät do nasho procesu
for i:= 0 to length(buf) do // posielaj spravy WM_CHAR if ( buf[i] <> 0 ) then SendMessage( hForControl, WM_CHAR, buf[i], 0 ) else break;
end;
procedure TForm1.Timer1Timer(Sender: TObject); begin
AddText; Timer1.Enabled:= false;
end;
Timer si nastav aspoň na päť sekúnd a po štarte nech je zapnutý. Ak spustíš aplikáciu, presuň sa napr do notepadu a skús, či to robí to čo chceš. Ak áno, tak si to už len patrične uprav na tvoje skratky, ak nie, napíš, ako to treba upraviť.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
Vdaka Fico. Ten cyklus "for i:= 0 to length(buf) do" sa mi zda ok, ale pastuje mi to iba prvy znak. A co som skusal bezne programy, vsade to ide len do xchat nie :|
edit: no neviem neviem ci to je dobra cesta, ked si to dam na klav. skratku a dam sa napr. do mozily tak to namiesto vlozenia textu otvori novy tab  pricom do notpadu to pekne vklada (s timerom to slo dobre)
|
|
Registrovaný: 11.01.09 Prihlásený: 26.10.26 Príspevky: 1401 Témy: 10 | 10 Bydlisko: Hrinova |
ha2 píše: ked si to dam na klav. skratku a dam sa napr. do mozily tak to namiesto vlozenia textu otvori novy tab
Mozilla má takisto svoje prednastavené hot keys, takže je možné, že tam vznikla akási kolízia. Preto je lepšie použiť nejakú skratku, ktorú nepoužíva. Skús program upraviť takto:
Kód: procedure TForm1.AddText(var Msg: TMessage); var i: integer; begin
FillChar(buf, 1024, 0); strcopy(@buf, 'toto sa prida do textu'); hForWindow:= GetForegroundWindow(); // zisti handle aktivneho okna procID:= GetWindowThreadProcessID(hForWindow, nil); AttachThreadInput(procID, GetCurrentThreadId(), true); // attachne sa do procesu tohto okna hForControl:= GetFocus(); // zisti fokus aktivneho komponentu v tomto okne AttachThreadInput(procID, GetCurrentThreadId(), false); // spät do nasho procesu
for i:= 0 to length(buf) do // posielaj spravy WM_CHAR if ( buf[i] <> 0 ) then SendMessage( hForControl, WM_CHAR, buf[i], 0 ) else break;
end;
procedure TForm1.FormCreate(Sender: TObject); begin
RegisterHotKey( Handle, 85, MOD_CONTROL OR MOD_ALT , 85 ); RegisterHotKey( Handle, 117, MOD_CONTROL OR MOD_ALT, 117 );
end;
procedure TForm1.FormDestroy(Sender: TObject); begin
UnregisterHotKey( Handle, 85 ); UnregisterHotKey( Handle, 117 );
end; Pričom do hlavnej triedy TForm1 pridaj riadok: Kód: procedure AddText(var Msg: TMessage); message WM_HOTKEY;
To zaistí, že táto funkcia sa spustí vždy po stlačení skratky CTR+ALT+U (to si zmeň ako treba vo funkcii RegisterHotKey. Vyhneš sa tak použitiu clipboardu, no tú skratku, ako vravím, musíš použiť tak, aby ju nemala zaregistrovaná žiadna aplikácia, v ktorej to chceš aplikovať.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
Zatial vdaka, no skusim az zajtra pretoze nemam cas ... skratky si preregistrujem nie? ved som si skusal aj napr. ctrl+c a prebil som si to na vlastnu udalost alebo alt+f4.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
Mas pravdu, treba mat inu skratku, a co mam dat do "Msg" ?
|
|
Registrovaný: 11.01.09 Prihlásený: 26.10.26 Príspevky: 1401 Témy: 10 | 10 Bydlisko: Hrinova |
Nepochopil som otázke. Ale Msg je štruktúra, ktorú vyplňuje systém, ty nič nevyplňuješ. Sú v nej informácie o prijatej správe (window message správe). Funkcia AddText sa vykoná vždy, ak hlavnému oknu dorazí správa WM_HOTKEY (ak bude detekované stlačenie zaregistrovanej klávesovej skratky), tzn že ty ju v programe nikde volať nemusíš.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
Presne takto som to mal len v inej procedure (asi som prepracovany). No len to pastuje iba prvy znak neviem preco.
|
|
Registrovaný: 11.01.09 Prihlásený: 26.10.26 Príspevky: 1401 Témy: 10 | 10 Bydlisko: Hrinova |
Skúšal si to na viacerých aplikáciach? Lebo mne to zatiaľ na každej funguje. Ak ti to robí všade, skús nastaviť breakpoint niekde v tele funkcie AddText a sleduj, kde sa preruší alebo proste kde sa niečo nevykoná a potom sem napíš čo sa deje.
|
|
Registrovaný: 21.12.08 Prihlásený: 14.07.16 Príspevky: 114 Témy: 21 | 21 |
tak prve co ma napadlo sa potvrdilo. V D7 to funguje dobre v 2010 nie...A tu 2010 potrebujem,pekne 
|
|
Stránka: 1 z 1
| [ Príspevkov: 23 ] | |
|