Symulacja ctrl+v

0

Witam,
W ramiach nauki robię sobie programik, który po wskazaniu danych współrzędnych (w tym przypadku pole, powiedzmy w Firefoxie) chciałbym, aby wkleił zwartość schowka.
Tak, znam PasteFromClipboard, jednak nie mam pojęcia jak mam to zastosować dla pola, które nie znajduje się w moim programie. Kombinowałem z keybd_event, jednak nie wychodzi mi.
Jakieś rady?

0

Szukanie okna aplikacji, szukanie odpowiedniego komponentu i wysłanie odpowiedniego komunikatu. Wszystko było :)
Poszukaj na forum.

0

Z pierwszym sobie poradzę, nieco gorzej z dwoma kolejnymi, a nie chciałbym spędzić paru godzin na szukaniu jeśli miałoby mi się i tak nie udać znaleźć. Jestem pewien, że są tu osoby, które coś podobnego mogą napisać z pamięci, ewentualnie z małym względem w budowę funkcji i taka właśnie osoba by mi się przydała :D

0

Bez konta nie mogę edytować postów, co za niefart.
Z drugiej strony może być też podpowiedź jak to znaleźć. Chodzi mi tu o jakieś słowa kluczowe, jeśli można.

0

To najwyższa pora założyć sobie konto na forum i móc swobodnie edytować. Jak chcesz sobie wkleić coś do
przeglądarki to musisz mieć na uwadze, że poza badziewnymi starszymi wersjami IE - nie wiem jak nowe,
bo nie używam. Ale właśnie Opera i być moze FireFox nie pozwalają w łatwy sposób na dostęp do swoich
kontrolek, bo nie mają one osobnych klas i uchwytów. Tak jest z Operą na przykład. Także żeby sobie do
niej wkleić odnośnik to musisz robić to mniej więcej tak jak poniżej symulując kliknięcie na pasek adresu
oraz symulując wciskanie poszczególnych klawiszy. Wznowienie okna Opery też jest możliwe tylko jeżeli
pobierzemy uchwyt na podstawie pliku wykonywalnego czyli opera.exe - jak go pobrać napisalem krotko
teraz w gotowcach - zobacz na: Uchwyt na podstawie nazwy pliku exe programu

A poniżej masz kod ktory wkleja do Schowka żądany tekst oraz dokonuje kliknięć w oknie Opery, teraz sobie
możesz pozmieniać ten kod tak aby działał z jaką chcesz przeglądarką. Bo jeżeli chodzi o Operę to da się - i
to przy pomocy DDE (przykłady w google) pobrać aktualny tytuł aktywnej zakładki oraz odnośnik do strony,
a tak poza tym z oknem Opery i elementami na nim poprzez wysyłanie komunikatów niewiele zdziałąsz, no a
przynajmniej ja nie wiem jak to robić. Podejrzewam że takie utrudnienie - powoduje większe bezpieczeństwo.

A przy okazji zabawy z zakodowaniem tego odkryłem że aby wywołać kombinację Shift + Insert (nie użyłem
Ctrl +V, bo mam przemapowany ten klawisz przez działający w tle skrypt w AutoHotkey) to trzeba to robić,
każąc Delphi koniecznie wciskać RShift. Jest też problem ze zwolnieniem później tego RShifta - jeżeli był w
międzyczasie wciskany Insert. Także stąd taki "myk" jak widać pod koniec kodu aby wciskanie klawiszy nie
pwoodowało efektu takiego jakbyśmy cały czas trzymali Shift wciśnięty. No i tak w ogołe to do łatwiejszego
przełączania okna, symulowania kliknięć oraz wciskań klawiszy - bardziej nadaje się skryptowy AutoHotKey.

// ...
procedure WklejDoSchowka(TekstDoWklejenia : string);
var
  Schowek : HGLOBAL;
begin
  OpenClipboard(0);
  EmptyClipboard;
  Schowek := GlobalAlloc(GMEM_MOVEABLE and GMEM_DDESHARE, Length(TekstDoWklejenia) + 1);
  StrCopy(GlobalLock(Schowek), PChar(TekstDoWklejenia));
  GlobalUnlock(Schowek);
  SetClipboardData(CF_TEXT, Schowek);
  CloseClipboard;
end;

procedure WklejZeSchowkaDoOpery;
var
  Opera_H : HWND;
  Old_Point : TPoint;
  Opera_Rect : TRect;
  Click_X, CLick_Y : integer;
begin
  // Pobranie uchwytu na podstawie nazy Aplikacji
  Opera_H := ExeProcessToHWnd('opera.exe');
  // Zapamiętanie pozycji kursora myszy
  GetCursorPos(Old_Point);
  // Jeżeli Opera uruchomiona to...
  if Opera_H > 0 then
  begin
    // Jeżeli Opera schowana do Ikony to...
    if IsIconic(Opera_H) = True then
    begin
      // ... Przywróć okno Opery
      SendMessage(Opera_H, WM_SYSCOMMAND, SC_RESTORE, 0);
    end
    else
    begin
      // Jeżeli okno opery nie schowane do ikony uaktywnik okno
      SetForeGroundWindow(Opera_H);
    end;
    // Skopiuj obszar okna Opery do zmiennej type TRect
    GetWindowRect(Opera_H, Opera_Rect);
    // Ze skopuiowanym obszarem...
    with Opera_Rect do
    begin
      // Zmienna Click_X = połowie wielkości okna Opery w pikselach
      Click_X := (Left + Right) div 2;
      // Zmienna Click_Y = górsz okna Opery plus podana liczba pikseli
      Click_Y := Top + 80;
      // Wciśnij Control i puść klawisze Ctrl + T aby utworzyć nową zakładkę
      // Kliknij lewym przyciskiem myszy na podany obszar
      // (spodziewany pod nim pasek adresu Opery) po czym
      // póść lewy klawisz myszy
      SetCursorPos(Click_X, Click_Y);
      Mouse_Event(MOUSEEVENTF_LEFTDOWN, Click_X, Click_Y, 0, 0);
      Mouse_Event(MOUSEEVENTF_LEFTUP, Click_X, Click_Y, 0, 0);
      // Naciśnij i puść Ctrl + A aby zaznaczyć cały tekst
      Keybd_Event(VK_LCONTROL, 0, 0, 0);
      Keybd_Event(Ord('A'), 0, 0, 0);
      Keybd_Event(Ord('A'), 0, KEYEVENTF_KEYUP, 0);
      Keybd_Event(VK_LCONTROL, 0, KEYEVENTF_KEYUP, 0);
      // Wciśnij Shift + Insert aby wkleić tekst ze Schowka Windowsa
      Keybd_Event(VK_RSHIFT, 0, 0, 0);
      Keybd_Event(VK_INSERT, 0, 0, 0);
      Keybd_Event(VK_INSERT, 0, KEYEVENTF_KEYUP, 0);
      Keybd_Event(VK_RSHIFT, 0, KEYEVENTF_KEYUP, 0);
      // Naciśnij ENTER
      Keybd_Event(VK_RETURN, 0, 0, 0);
      Keybd_Event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0);
      // Cały powyższy kod spowoduje otwarcie na nowej zakładce strony
      // o adresie takim jaki był wklejony tekst - ze Schowka Windowsa
      with Old_Point do
      begin
        // Ustawienie kursora myszy w miejscu z przed uruchomienia kodu
        SetCursorPos(X, Y);
      end;
    end;
    // Konieczny kod - przywraca na chwile okon aplikacji po czym
    // wciska jeszcze raz Shift i ponownie przywraca okno Opery a
    // ma to na celu zwolnienie przycisku prawy shift, ktory jest
    // do wklejania konieczny, a który przy wciskaniu kodem, wraz
    // z Insertem nie zostaje zwolniony - nawet gdy tak zakdowano
    SetForegroundWindow(Application.Handle);
    Keybd_Event(VK_RSHIFT, 0, KEYEVENTF_KEYUP, 0);
    SetForegroundWindow(Opera_H);
  end;
end;

procedure TForm1.Button1Click(Sender : TObject);
begin
  WklejDoSchowka(Edit1.Text);
  WklejZeSchowkaDoOpery
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1