webForumDet fria alternativet

Hitta rätt fönster

Programmering

0 svar · 378 visningar · startad av jt

Medlem sedan juni 2000350 inlägg
Frågan#1

Det frågades efter mer frågor, alla tips/svar mottages tacksamt.

Jag har ett delphi program där jag försöker göra följande.

Jag startar ett program med CreateProcess då får jag tag i programmets "thread identifier" sedan använder jag EnumThreadWindows för att ta reda på vilket som är huvudfönstet i programmet. Det jag vill göra är att använda Windows.Setparent så att jag kan infoga programmet i min applikation.

Problemmet är hur jag ska få tag i rätt fönster i callback funktionen när jag kör EnumThreadWindows.

Jag har använt följande funktioner i olika kombinationer för att filtrera ut rätt fönster:
IsWindowVisible(Awnd)
GetParent(Awnd) = 0
GetWindowLong(AWnd, GWL_HWNDPARENT) = 0

Om jag startar notepad så hittar jag ett fönster där följande stämmer
IsWindowVisible(Awnd)
GetParent(Awnd) = 0
GetWindowLong(aWnd, GWL_HWNDPARENT) = 0

Här funkar Windows.Setparent utan problem. Finns ju inte så många fönster att välja på ;).

Men kör jag en enkel delphi applikation med ett mainformulär så hittas två fönster med följande egenskaper.

Form1(Mainformuläret):
IsWindowVisible(Awnd)
GetParent(Awnd) = 0

Project1(Applications fönstret):
IsWindowVisible(Awnd)
GetParent(Awnd) = 0
GetWindowLong(aWnd, GWL_HWNDPARENT) = 0

Här funkar Windows.Setparent bara om jag använder Form1 fönstret.

Jag vet inte vilka program som kommer att startas från mitt program.
Jag undrar altså om det finns någon bra/säker metod för att alltid hitta rätt fönster.
En lösning som jag tror fungerar är att Applications fönstrets handle kommer att vara lägre än mainformulärets. Men är detta en bra lösning?

260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)