[C++Builder]Obce pole klasy TEdit

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

[C++Builder]Obce pole klasy TEdit

Post autor: zenzee » 16 mar 2009, 18:56

Witam.
No właśnie.
Dorwałem inny program, w jednym z okien tego programu jest pole klasy TEdit, a
w nim jakiś tam tekst.
Skopiowałem programowo ten tekst do schowka , ale po uprzednim zaznaczeniu go myszką.
Chcę,aby mój program sam ten tekst sobie zaznaczył.
Jak tego dokonać :?: .
Przypominam,że pole TEdit jest w innym obcym programie,a nie w tym co piszę.
Dzięki. :grin:

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 16 mar 2009, 19:08

A w jaki sposób robisz kopiowanie do schowka?

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 16 mar 2009, 19:17

Po znalezieniu uchwytu(hwnd) tak:

Kod: Zaznacz cały

SendNotifyMessage(hwnd,WM_COPY,0,0);

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 16 mar 2009, 21:34

Jak masz uchwyt to możesz odczytać wartość wpisaną w to pole (nie pamiętam funkcji api), a jak ją odczytasz to możesz ją wsadzić do schowka z poziomu swojego programu :mrgreen: Nie potrzeba do tego zaznaczania.

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 16 mar 2009, 21:51

To fajnie. :mrgreen:
No tak ja też tego nie pamiętam.Może za mało lecytyny. :mrgreen:
Może mała podpowiedź. :razz:

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 16 mar 2009, 22:49

Kiedyś bawiłem się takimi rzeczami w VB. Jutro poszukam w czeluściach mojego dysku :)

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 16 mar 2009, 23:21

Jak to mówią "Potrzeba jest matką wynalazków". :mrgreen:
Wymyśliłem coś takiego:

Kod: Zaznacz cały

HWND hc = FindWindowA("#32770","Czytaj wiadomości");
HWND hcx = FindWindowExA(hc,NULL,"Edit","");
if(hcx)
{
Beep(300,200);
SendNotifyMessage(hcx,WM_LBUTTONDOWN,0,0);
SendNotifyMessage(hcx,WM_LBUTTONUP,0,0);
Sleep(500);
SendNotifyMessage(hcx,WM_LBUTTONDOWN,0,0);
SetCursorPos(1200,190);
Sleep(500);
SendNotifyMessage(hcx,WM_COPY,0,0);
}
Wstawia kursor na początku tekstu,zaznacz cały tekt i kopiuje go do schowka.
Narazie nie znalazłem nic innego. :razz:
Jak pogrzebiesz w swoim kompie i coś znajdziesz to napisz. :wink:
Będę czekał.
Pozdro.

Awatar użytkownika
c4r0
Moderator
Posty: 2150
Rejestracja: 13 kwie 2004, 19:56
Lokalizacja: z lasu
Kontakt:

Post autor: c4r0 » 17 mar 2009, 11:27

Funkcja GetWindowText: http://4programmers.net/WinAPI/GetWindowText
Napisane że nie nie pobiera tekstu z kontrolki osadzonej w innej aplikacji, ale u mnie pobiera :P I jeszcze jeśli chodzi o uchwyty to jest bardzo przydatne narzędzie które pewnie znasz: Spy++ (tu do ściągnięcia), zwłaszcza funkcja 'find window' którą możesz znaleźć w menu 'search' ;) A co do tego myku co wymyśliłeś, to nie lepiej byłoby ustawić focus na to pole a potem wysłać mu "Ctrl+A"? ;)

Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

Post autor: zenzee » 17 mar 2009, 12:21

No tak pobiera nazwę okna z uchwytem "hc":

Kod: Zaznacz cały

char B[256];
GetWindowTextA(hc,B,255);
Memo3->Text = &B[0];
,ale nic nie pobiera z uchwytu "hcx" z pola
Edit tam gdzie mam ten tekst. :neutral:

Kod: Zaznacz cały

char B[256];
GetWindowTextA(hcx,B,255);
Memo3->Text = &B[0];

Spy++ nie mam, ale go ściągnę: mam WinID(najadę myszką na okno i mam jego uchwyt,
nazwę klasy itd.)
Skrót CTRL+A działa chyba na systemowy notatnik i wordpad-a.
Tamto okno nie obsługuje żadnych skrótów,taka cwana bestia. :mrgreen:
Ten kodzik co napisałem to tak na szybkiego,ale też nie byle jaki:
mam dwa aktywne kursory w moim programie i w tym drugim,co z nim walczę. :mrgreen:
Jakieś inne pomysły. :grin:

[ Dodano: 2009-03-17, 19:25 ]
Jeszcze nie znalazłem rozwiazania mojego problemu :sad: ,ale w miedzyczasie poprawiłem mój kod. :razz:
Teraz bez względu na to gdzie na ekranie będzie okno z wiadomością
program zaznaczy tekst i skopiuje go do schowka,bo wcześniej musiało być ciągle w
jednym miejscu:

Kod: Zaznacz cały

TPoint PozycjaKursora;
GetCursorPos(&PozycjaKursora);
HWND hc = FindWindowA("#32770","Czytaj wiadomości");
HWND hcx = FindWindowExA(hc,NULL,"Edit","");
if(hcx)
{
tagRECT rect;
GetWindowRect(hcx,&rect);

Beep(300,200);
SendMessage(hcx,WM_LBUTTONDOWN,0,0);
  SendMessage(hcx,WM_LBUTTONUP,0,0);
   SendMessage(hcx,WM_LBUTTONDOWN,0,0);
Sleep(500);
       SetCursorPos(rect.left+ 200,rect.top+100);
Sleep(500);
      SendMessage(hcx,WM_COPY,0,0);
Sleep(500);
      SendMessage(hcx,WM_LBUTTONDOWN,0,0);
    SendMessage(hcx,WM_LBUTTONUP,0,0);
SetCursorPos(PozycjaKursora.x,PozycjaKursora.y);
}
else
ShowMessage("Nie znaleziono klasy !");


Jak nie znajdę rozwiązania to zastosuję chyba ten kodzik :mrgreen:

[ Dodano: 2009-03-18, 15:30 ]
Wreszcie dostałem odpowiedź ,banalnie prostą: :grin:

Kod: Zaznacz cały

SendMessage(hcx,EM_SETSEL,0,70);
Taki komunikat trzeba wysłać do kontrolki.Nawet w Spy++ to teraz mam(jest lepszy od WinID).

[ Dodano: 2009-03-18, 19:24 ]
Teraz pokumałem i nawet nie muszę zaznaczać i kopiować tamtego testu do schowka. :smile:
Odrazu przeniosłem go sobie do mojego pola "Memo":

Kod: Zaznacz cały

char lpBuf[201];
SendMessage(hcx, WM_GETTEXT,200, ((LPARAM)lpBuf));
Memo2->Text = lpBuf;
No,teraz już wszystko wiem. :mrgreen:

ODPOWIEDZ