You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?
wellicht helpt WindowFromPoint of getdc (en dan pixels ophalen) je meer.
Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.
Ik zal ondertussen even naar windowfrompoint kijken.
You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?
Ook andere windows dan het forgroundwindow kunnen voor je window staan.Guldan schreef op maandag 19 januari 2009 @ 12:07:
Misschien is het niet duidelijk genoeg geweest: stel, ik heb een venster van notepad en ik wil weten of deze(niet geminimaliseerd) nog achter een ander venster staat (word). dan is het toch logisch om te checken of het foreground window anders is dan 'notepad'.
-een windows tussen het voorgrond windows en jouw window
-popup van andere applicatie.
-een window van een "always on top applicatie"
De vraag moet eigenlijk zijn:
Waarom wil je weten of windows over elkaar heen staan.
[ Voor 7% gewijzigd door leuk_he op 19-01-2009 12:46 ]
Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.
Afgezien daarvan hoef je niet te weten of er andere windows voor je staan. Dat kan je op Vista nogal wat problemen gaan opleveren (icm Aero)
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
-niks-
Ik kan met getTopWindow de hwnd van de bovenste window halen. hoe kan ik deze dan sorteren op z waarde? Ik heb al een boel gezocht maar weinig nuttigs gevonden.
You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?
Waarbij je ervan uit gaat dat windows rechthoekig vierkantMLM schreef op maandag 19 januari 2009 @ 13:40:
Je kan alle windows af lopen en sorteren op Z waarde, en daarna kijken of jouw window overlapt word door een window met een lagere Z met GetWindowRect() oid.

[ Voor 3% gewijzigd door leuk_he op 19-01-2009 15:28 ]
Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.
Nou ja; in principe zijn windows altijd rechthoekig (vierkant sowieso nietleuk_he schreef op maandag 19 januari 2009 @ 14:48:
[...]
Waarbij je ervan uit gaat dat windows vierkant zijn... wat niet altijd het geval is.
[ Voor 3% gewijzigd door RobIII op 19-01-2009 15:04 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
- Loop over GetWindowNext() met GW_HWNDPREV om door de Z-order naar boven te lopen
- Voor elke window die je terugkrijgt, gebruik GetWindowRect() om het oppervlak van dat window te krijgen
- Kijk of het oppervlak van jouw window binnen het oppervlak van stap 2 valt
- Zo ja -> er is een window dat jouw window overlapt
- Zo nee -> volgende window
Om dit te verbeteren moet je ook nog rekening houden met transparency (is jouw window zichtbaar ACHTER een andere window), en de mogelijkheid dat de linkerhelft van je window achter A valt, en de rechterhelft achter B (dus, bijhouden welke gebieden onzichtbaar zijn)
Maar als sidenote, is er niet een VEEL simpeler oplossing, dit gewoon laten doen door windows. Wacht op een WM_PAINT message voor je je window update. Als je window onzichtbaar is (zials bepaald door windows zelf), ga je volgens mij geen WM_PAINT messages krijgen
-niks-
Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein
Dat is dus handiger met regions. Sowieso kan een window rect een heel stuk groter zijn dan z'n region. Als je het op die manier wilt doen, begin dan met de region van je eigen window, en trek daar dan vervolgens alle regions van non-transparent bovengelegen windows vanaf. En eigenlijk zou je 'm ook nog moeten ANDen met de desktop region. Hou je geen empty region over, dan ben je nog zichtbaar.MLM schreef op maandag 19 januari 2009 @ 15:55:
Goed, ik heb dit nooit gedaan maar met MSDN ernaast denk ik dat het zoiets zal zijn (semi-code):
- Loop over GetWindowNext() met GW_HWNDPREV om door de Z-order naar boven te lopen
- Voor elke window die je terugkrijgt, gebruik GetWindowRect() om het oppervlak van dat window te krijgen
- Kijk of het oppervlak van jouw window binnen het oppervlak van stap 2 valt
- Zo ja -> er is een window dat jouw window overlapt
- Zo nee -> volgende window
Om dit te verbeteren moet je ook nog rekening houden met transparency (is jouw window zichtbaar ACHTER een andere window), en de mogelijkheid dat de linkerhelft van je window achter A valt, en de rechterhelft achter B (dus, bijhouden welke gebieden onzichtbaar zijn)
Het punt is wel dat GetNextWindow() nogal flakey is. De volgorde kan wijzigen terwijl je er doorheen loopt, waardoor je windows kunt overslaan of in een infinite loop terecht komt. Je kunt beter met EnumWindows()/EnumChildWindows() aan de slag, omdat die gebruik maken van een shapshot.
[ Voor 78% gewijzigd door .oisyn op 20-01-2009 13:25 ]
Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| int GetWindowLevel(HWND MyWindow) { //de vector waarin de window hwnds opgeslagen worden vector<HWND> vWindows; HDESK hDesk = GetThreadDesktop(GetCurrentThreadId()); //Geef enumDesktopWindows een link naar de callback mee WNDENUMPROC lpEnumProc = (WNDENUMPROC)ScreenHelper::EnumChildProc; EnumDesktopWindows(hDesk, lpEnumProc, (LPARAM)&vWindows); //loop door de lijst en kijk op welk nr je window staat (z order) for(int i=0;i < vWindows.size(); i++) { HWND sel = vWindows.at(i); if(sel == MyWindow) { return i+1; } } return 0; } |
Nu de code voor de callback.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam) { if (!::IsWindowVisible(hwnd)) return TRUE; if (::GetParent(hwnd)) { return TRUE; } RECT rc; ::GetWindowRect(hwnd, &rc); if (rc.bottom==0 && rc.left==0 && rc.right==0 && rc.top==0) return TRUE; if (::IsIconic(hwnd)) return TRUE; char windowText[256]; if (::GetWindowText(hwnd, (LPWSTR)windowText, sizeof(windowText))) { RECT rtmp, rme; GetWindowRect(myWindow, &rme); if (IntersectRect(&rtmp, &rme, &rc)) { //found an intersection - but we dont know //whether this window is on top of ours or not std::vector<HWND>* pvWindows = (std::vector<HWND>*)lParam; pvWindows->push_back(hwnd); } } return TRUE; } |
Met deze code kan je zien op welk z order een venster staat. Dat was wat ik nodig was!. Allemaal bedankt voor de hulp. Door jullie replies wist ik tenminste waar ik het moest zoeken
You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?