| Autor | Správa |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 114
 | Zaslal: Pi 25.06.10 15:11 |   |
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) |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Pi 25.06.10 16:59 |   |
| ha2 napísal: | | 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ť. |
| |
   |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 114
 | Zaslal: Pi 25.06.10 18:11 |   |
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. |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 114
 | Zaslal: So 26.06.10 20:49 |   |
Mas pravdu, treba mat inu skratku, a co mam dat do "Msg" ? |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 26.06.10 21:00 |   |
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íš. |
| |
   |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 114
 | Zaslal: So 26.06.10 21:18 |   |
Presne takto som to mal len v inej procedure (asi som prepracovany). No len to pastuje iba prvy znak neviem preco. |
| |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: So 26.06.10 21:26 |   |
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. |
| |
   |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 114
 | Zaslal: Ne 27.06.10 14:07 |   |
tak prve co ma napadlo sa potvrdilo. V D7 to funguje dobre v 2010 nie...A tu 2010 potrebujem,pekne  |
| |
  |
 |
|