Autor Téma: Obsluha cudzieho programu  (Přečteno 2554 krát)

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 57
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Obsluha cudzieho programu
« kdy: 24-09-2019, 08:12:36 »
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: [Vybrat]
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;

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.
Lazarus, Delphi - RQ Money

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 188
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:Obsluha cudzieho programu
« Odpověď #1 kdy: 24-09-2019, 13:00:43 »
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

Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 188
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 57
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Obsluha cudzieho programu
« Odpověď #3 kdy: 25-09-2019, 13:02:16 »
Slappy, vďaka za radu, pohol som sa o krok dopredu.
Pomocou funkcie EnumWindows som si zistil HWND všetkých okien:
Kód: [Vybrat]
EnumWindows(@EnumWindowsProc, LPARAM(sl));Potom pomocou funkcie EnumChildWindow som si zistil potomkov:
Kód: [Vybrat]
EnumChildWindows(AHandle, @EnumChildProc, LPARAM(ASList));
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)...
« Poslední změna: 25-09-2019, 13:12:52 od Slavomir »
Lazarus, Delphi - RQ Money

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2623
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsluha cudzieho programu
« Odpověď #4 kdy: 25-09-2019, 13:30:48 »
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é).
No a nebylo by jednoduzsi skopat dotavateli prd*l, aby dodal soft na urovni 21. stoleti?

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 57
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Obsluha cudzieho programu
« Odpověď #5 kdy: 25-09-2019, 14:04:56 »
Ľahko sa povie, ťažko sa vykoná.  ;D Je to celoslovenský dodávateľ pre veľké firmy, má takmer 200 zamestnancov - komu tam môžem nakopať  :-[?
Aby som nekrivdil dodávateľovi - on dodal so softvérom aj reporty (tvorené v ReportBuilderi). Tieto reporty som ja ešte na naše podmienky dopracoval tak, aby sme nemuseli ručne vypisovať polia, ktoré sa často menia. Skúšal som pôvodne priamo cez úpravu šablóny reportu niečo vytvoriť (akýsi Form so zoznamom, z ktorého by si užívateľ iba vybral správne meno a kliknutím  myši vložil do reportu), ale na nič také použiteľné tam nie je (vstavaný ReportBuilder má len oklieštené funkcie). Bol som rád, že som tam našiel a využil jednu použiteľnú vstavanú funkciu - akýsi InputSBox. Keď ho užívateľ vyplní, mená sa vložia do reportu:



Ako ďalší krok som chcel užívateľom (teda našim účtovníčkam vo firme  ;)) ponúknuť pomocou ďalšieho programu zoznam mien na výber (s následným vložením do textového poľa), aby nemuseli stále vyplňovať tieto polia na klávesnici. Lebo neraz sa stalo, že sa pomýlia (po odoslaní formulára) a musia vypisovať všetko nanovo (ak chcú opraviť jednu textovú položku).
Celý program (aj s reportom) však beží ako RemoteApp...
« Poslední změna: 25-09-2019, 14:13:01 od Slavomir »
Lazarus, Delphi - RQ Money

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4575
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsluha cudzieho programu
« Odpověď #6 kdy: 25-09-2019, 14:59:20 »
Citace
Je to celoslovenský dodávateľ pre veľké firmy, má takmer 200 zamestnancov - komu tam môžem nakopať  ?
Predsa šéfovi. Ale niečo také by naozaj mohli urobiť. Zaslaním e-mailu určite nič nepokazíš.
.
Teraz mimo témy: fuj, aké škaredé ;)  Mám tým na mysli vzhľad. Ja osobne by som zmenšil medzeru medzi Label a príslušným TextBox. A naopak. Zväčšil medzeru medzi TextBox a nasledujúcim Label. Bude to vyzerať lepšie a bude to aj menej mätúce. Ten rámček okolo TextBox-ov je úplne zbytočný. Ja mám rád také hutnejšie a čím menšie formuláre, aby som očami obsiahol naraz čo najviac.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline KarelHorky

  • Plnoletý
  • ***
  • Příspěvků: 204
  • Karma: 8
    • Verze Delphi: 7, XE6, Delphi 10.2 Tokyo
Re:Obsluha cudzieho programu
« Odpověď #7 kdy: 25-09-2019, 15:38:38 »
Pokud na tom cizím programu funguje vložení ze schránky (Ctrl+V), tak si připrav okno, kde budou zvolená jména a tlačítka, kterými je vložíš do schránky. Pak se přepneš do cizího programu a vložíš, postupně jedno po druhém. Riziko překlepu bude minimální, rychlost zadání více než dostatečná. Když už se nedostaneš přímo k handle editu...

Offline Slappy

  • Plnoletý
  • ***
  • Příspěvků: 188
  • Karma: 11
  • Slappy
    • Verze Delphi: 10.2 Tokyo + Vsetky :)
    • unSigned
Re:Obsluha cudzieho programu
« Odpověď #8 kdy: 25-09-2019, 18:30:37 »
Slappy, vďaka za radu, pohol som sa o krok dopredu.
Pomocou funkcie EnumWindows som si zistil HWND všetkých okien:
Kód: [Vybrat]
EnumWindows(@EnumWindowsProc, LPARAM(sl));Potom pomocou funkcie EnumChildWindow som si zistil potomkov:
Kód: [Vybrat]
EnumChildWindows(AHandle, @EnumChildProc, LPARAM(ASList));
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)...


Cize ta aplikacia bezi niekde inde a ty si pripojeny cez RDP?
V kazdom pripade to nemoze byt problem ak je to Windows Delphi app.
Moje projekty: http://www.unsigned.sk Tvorba cool dizajnovych instalatorov v NSIS a Inno Setup. Rozsirenie pre Visual Studio a RAD Studio pre tvorbu NSIS a Inno Setup instalatorov.

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 57
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Obsluha cudzieho programu
« Odpověď #9 kdy: 25-09-2019, 19:10:30 »
# Stanislav:
Citace
Predsa šéfovi. Ale niečo také by naozaj mohli urobiť. Zaslaním e-mailu určite nič nepokazíš.
Každý jeden zásah do programu, ktorý požadujeme, nás stojí veľké peniaze.
Citace
Teraz mimo témy: fuj, aké škaredé
Súhlasím, ale 1) neviem to ovplyvniť (je to vstavaná funkcia aplikácie) a 2) ani nepotrebujem (funguje to, tak mi to až tak nevadí). Počet zadávaných textových polí i samotný text v nadpise si určujem ja, aplikácia dodá formulár. :)

#Karel:
Citace
Pokud na tom cizím programu funguje vložení ze schránky (Ctrl+V), tak si připrav okno, kde budou zvolená jména a tlačítka, kterými je vložíš do schránky.
Celkom dobré riešenie, vďaka za tip (ak to nepôjde inak).

#Slappy:
Citace
Cize ta aplikacia bezi niekde inde a ty si pripojeny cez RDP?
Presne tak. Cez RDP pristupujem do tohto programu aj v práci aj z domu (keď potrebujem).
Citace
V kazdom pripade to nemoze byt problem ak je to Windows Delphi app.
Je to určite Win Delphi app (v poznámke O programe sa nachádza text "D XE2 RB14"). Ešte to ponúka aj vizuálne štýly - všetky patria do "Delphi styles".
« Poslední změna: 25-09-2019, 19:12:06 od Slavomir »
Lazarus, Delphi - RQ Money

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4575
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsluha cudzieho programu
« Odpověď #10 kdy: 25-09-2019, 21:59:25 »
Citace
Každý jeden zásah do programu, ktorý požadujeme, nás stojí veľké peniaze.
Ale toto beriem ako požiadavku užívateľov. Mali by byť radi, že im dávate návrhy na jeho zlepšenie. A nie to ešte im za to aj platiť. Som presvedčený o tom, že Vy ako užívatelia im každoročne platíte poplatok (SaS).
Jaj, zabudol som, že sme na Slovensku ;D ;D ;D
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 57
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Obsluha cudzieho programu
« Odpověď #11 kdy: 26-09-2019, 05:06:21 »
Zabudol som uviesť, že ak použijem metódu EnumChildWindow, získam pri tomto vzdialenom programe ClassName: RAIL_WINDOW. Môj tip je, že HWND, ktoré získam, patrí skôr videu, ktoré zobrazuje okno (TForm)...

Microsoft dokumentácia uvádza:
Citace
Certain classes of user input are not directly received by the RAIL window/icon as keyboard or mouse input. Examples include right-clicking the window's taskbar icon; key combinations to minimize, maximize, or restore all windows; and all user interactions with notification icons. These interactions are posted to the RAIL window/icon as non-keyboard or non-mouse messages, and, hence, cannot be sent over the core RDP channel. The client sends these interactions to the server as RAIL Virtual Channel messages.

Asi to nebudem komplikovať. Urobím podľa návrhu Karola jednoduchý program menších rozmerov (bude stále na vrchu), z ktorého sa budú dať zo zoznamu kliknutím kopírovať mená a užívateľ ich len bude vkladať do textových polí.  ::)
« Poslední změna: 26-09-2019, 05:31:24 od Slavomir »
Lazarus, Delphi - RQ Money

Offline miroB

  • Guru
  • *****
  • Příspěvků: 534
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:Obsluha cudzieho programu
« Odpověď #12 kdy: 26-09-2019, 15:48:57 »
Ak ide o ovladanie cudzieho programu tak najlepsie je vyuzit IAccessible.
Deklarované vo Winapi.oleacc.pas
U mňa v : "C:\Program Files (x86)\Embarcadero\Studio\19.0\source\rtl\win"
Dokázal som zo svojej aplikácie v cykle riadiť program pre podávanie daňového priznania. (r. 2018)
Vývoj bol hrozná drina, ale išlo to monumentálne. Treba ale veľa naštudovať..
Na webe sú tiež pomocné programy. Vtedy som ako pomôcku používal program
"AccExplorer.exe"

Aktuálny odkaz na iný program (aj zdrojáky):
https://github.com/ThePacielloGroup/aviewer
https://developer.paciellogroup.com/resources/aviewer/
Pozor nie som si istý, či ten ide aj pre win programy.  Zvláda browsery.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2623
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsluha cudzieho programu
« Odpověď #13 kdy: 26-09-2019, 18:03:50 »
To mi pripomelo, ze se mi pred radou let libil Sikuli - obecny nastroj pro analyzu zobrazeneho obsahu a simulaci user actions.

Chtel jsem ho pouzit na automaticke testovani aplikace, ale nakonec jsme tu myslenku pro nedostatek casu vzdali, protoze velka slabina byla, ze ten script musel byt napsan pro konkretni rozmery a rozliseni obrazovky, ale jinak uzasny nastroj. Jestli by to fungovalo pres Remote desktop nevim.

https://github.com/RaiMan/SikuliX1

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 57
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Obsluha cudzieho programu
« Odpověď #14 kdy: 27-09-2019, 08:26:55 »
Ďakujem všetkým za podnetné nápady a rady. Nečakal som na začiatku, že to bude také komplikované. Zvládam len jednoduchšie programovanie (ako samouk).
Priznám sa na rovinu, že obsluhu cudzieho programu (cez RDP) asi nechám tak. Je potrebné študovať pre mňa nové veci, čo je jednak časovo náročné a tiež už mi to tak nepáli ako kedysi  ::). V mojom veku si už radšej zájdem vo voľnom čase do prírody (turistika, záhradka, hubárstvo, včielky), ako sedieť za klávesnicou ďalšie hodiny doma po práci.
Aktuálne mám urobený programček, ktorý užívateľovi ponúkne jednoduché okno (vždy navrchu) s tlačidlami (menami), ktoré sa po kliknutí skopírujú do schránky. Užívateľ teda len vyberie príslušné textové pole formulára a vloží doň obsah schránky. Užívateľovi to takto bude musieť stačiť.  ;D
« Poslední změna: 27-09-2019, 08:28:31 od Slavomir »
Lazarus, Delphi - RQ Money