| Autor | Správa |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Ut 22.06.10 13:41 |   |
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. |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 22.06.10 14:14 |   |
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/ms646276%28VS.85%29.aspx |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Ut 22.06.10 14: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 |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 22.06.10 14:25 |   |
no ved to je jedno comu to posles, len musis vediet zistit handle(hwnd) toho objektu |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Ut 22.06.10 16:11 |   |
takze zistit handle focus okna a potom focus komponenty? oh  |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Ut 22.06.10 20:45 |   |
bingo, skus getForegroundwindow alebo getActivewindow alebo GetFocus aj komponenta je vacsinou odvodena od window cize na HWND aby mohla preberat messages |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Pi 25.06.10 10:31 |   |
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) |
|
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Pi 25.06.10 10:57 |   |
preco to riesis takto ? chces sa vyhnut zistovaniu handle okna ktoremu to mas poslat ? |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Pi 25.06.10 11:01 |   |
moc mi to neslo tak som to spravil tak |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Pi 25.06.10 11:30 |   |
hm, overil si si ci si spravne nasiel handle okna programom SPY++ ? |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Pi 25.06.10 11:54 |   |
problem nieje v tom ci si najdem handle focus okna ale vtom ze nemam sajnu co dalej guglim ale nic podobne som nenasiel |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Pi 25.06.10 12:11 |   |
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); |
| |
  |
 |
ha2
 Užívateľ
 Založený: 21.12.2008 Príspevky: 112
 | Zaslal: Pi 25.06.10 13:28 |   |
| 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 |
| |
  |
 |
coldak
 Skúsený užívateľ
 Založený: 29.10.2008 Príspevky: 927
 | Zaslal: Pi 25.06.10 13:36 |   |
|
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 909
 | Zaslal: Pi 25.06.10 13:40 |   |
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ť. |
| |
   |
 |
|