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?
Szukanie okna aplikacji, szukanie odpowiedniego komponentu i wysłanie odpowiedniego komunikatu. Wszystko było :)
Poszukaj na forum.
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
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.
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;