FreePascal (FPC) a Lazarus > Obecné

Obsluha cudzieho programu

(1/4) > >>

Slavomir:
Ahojte, prosím o radu. V práci vypĺňame často v účtovnom programe (tvorenom dodávateľom v Delphi) formulár s viacerými textovými poliami (zrejme TEdit).
Chcel by som si v Lazaruse vytvoriť program, ktorý by mi po klinkutí na textové pole tohto formulára ponúkol zoznam vlastných textov s položkami. Väčšinou ide o mená osôb, ktoré by užívateľ namiesto prácneho vypisovania vložil do tohto textového poľa len kliknutím na položku zoznamu. Ten zoznam môže to byť ponúknutý buď formou TPopupMenu alebo TListBox (čo je asi jednoduchšie a rozbalené).

Mám zatiaľ zistené HWND daného formulára cez funkciu:

--- Kód: ---function ENUMWINDOWSPROC(WHandle: HWND; LParM: LParam): LongBool; StdCall; Export;
  var
     Title: array[0..128] of widechar;
     ClassName: array[0..128] of char;
     sTitle, sClass, Linia: wideSTRING ;
  begin
   Result:=True;
   GetWindowTextW(wHandle, Title, 128);
   GetClassName(wHandle,ClassName,128);
   sTitle := Title;
   sClass := ClassName;
end;
--- Konec kódu ---

Danou funkciou získam zoznam všetkých okien na obrazovke, viem si však nájsť môj formulár pomocou jeho nadpisu.
Takže rodiča (okno) mám, netuším však, ako teraz:

* - zistím jeho deti (teda HWND daného TEdit - zvlášť, ak je ich viac)
* - obslúžim tieto komponenty (pretože text by sa mal vložiť presne do toho textového poľa, na ktoré klikne užívateľ). Vopred ďakujem za radu.

Slappy:
Na nieco take by som odporucal nativne Win32 API. Vo Win API je vsetko Window - okno je Window, control = komponent je Window a hocijake Window dokaze prijimat a posielat spravy.

0) Zisti HWND daneho okna (Form - Control) toho cieloveho programu. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumchildwindows

1) Pripoj hook toho okna, aby si ziskal pristup k jeho udalostiam. https://docs.microsoft.com/en-us/windows/win32/winmsg/hooks?redirectedfrom=MSDN

2) Po kliknuti mysou (zdetekuje sa pomocou hooku 1) zobraz svoj formular s moznostami a logikou ktoru potrebujes

3) Posli spravu WM_SetText cim nastavis text pre TEdit https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-settext

Slappy:
Este doplnim nejake blizsie odkazy. Dolezite je uvedomit si, ze sa vsetko toci okolo HWND toho TEdit:

0) https://stackoverflow.com/questions/12928799/how-to-find-all-text-fields-in-a-window

1) http://forum.codecall.net/topic/60141-mouse-hook-tutorial-with-delphi-codes/ pripadne https://stackoverflow.com/questions/35487224/hook-wh-getmessage-and-filter-wm-settext-only

Slavomir:
Slappy, vďaka za radu, pohol som sa o krok dopredu.
Pomocou funkcie EnumWindows som si zistil HWND všetkých okien:

--- Kód: ---EnumWindows(@EnumWindowsProc, LPARAM(sl));
--- Konec kódu ---
Potom pomocou funkcie EnumChildWindow som si zistil potomkov:

--- Kód: ---EnumChildWindows(AHandle, @EnumChildProc, LPARAM(ASList));
--- Konec kódu ---

Všetko funguje u všetkých okien - s výnimkou okna, o ktoré mám záujem :o. Tam mi nevypisuje potomkov okna ako u iných programov.
Po dlhšom hľadaní príčiny som sa dozvedel na tomto odkaze, že ak je program s daným oknom spúšťaný zo servera ako tzv. RemoteApp, nedá sa údajne ovládať:
"the local display of the remote system is only a video of what's happening, no windows or controls can be interacted with directly.
best solution: run your script on the remote system.".
Skúsil som program prehodiť na server a odtiaľ spustiť, bez výsledku (potomkovia sa nezobrazili).  :-[
Takže som sa k ďalšiemu kroku nedostal (práca s TEdit)...

pf1957:

--- Citace: Slavomir  24-09-2019, 08:12:36 ---V práci vypĺňame často v účtovnom programe (tvorenom dodávateľom v Delphi) formulár s viacerými textovými poliami (zrejme TEdit).
Chcel by som si v Lazaruse vytvoriť program, ktorý by mi po klinkutí na textové pole tohto formulára ponúkol zoznam vlastných textov s položkami. Väčšinou ide o mená osôb, ktoré by užívateľ namiesto prácneho vypisovania vložil do tohto textového poľa len kliknutím na položku zoznamu. Ten zoznam môže to byť ponúknutý buď formou TPopupMenu alebo TListBox (čo je asi jednoduchšie a rozbalené).

--- Konce citace ---
No a nebylo by jednoduzsi skopat dotavateli prd*l, aby dodal soft na urovni 21. stoleti?

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi