Ben ik weer...
Ik zit nu dus al 2 uur te zoeken op een stommiteit die ik maar niet opgelost krijg.
Ik maak gebruik van VB6 (geen offtopic gedoe daarover a.u.b.) en ben nu bezig met wat API calls om processen af te sluiten.
Ik weet dat ik met TerminateProcess een proces keihard kan sluiten, maar ik wil het wel graag netjes houden. Daarvoor gebruik ik het volgende:
waarbij m_hWnd de handle naar mijn Window is, WM_Close = 4. Dit werkt meestal wel, maar in geval van (bijvoorbeeld!) Internet Explorer niet. Deze opent namelijk een hele bult hWnd's (iedere tooltip/toolbar etc is een hWnd).
Nu wil ik mijn functie wel redelijk generiek houden, en dus niet keihard op de IEFrame class gaan zitten zoeken ofzo. Ik kan door alle hWnd's van proces heen lopen dus ook dat is het probleem niet.
Ik gebruik de volgende code om het hWnd via een ProcessID te verkrijgen:
Zoals je ziet op regel 15 spring ik uit de loop als ik een willekeurig hWND heb gevonden van het juiste proces. Deze exit kan ik eruit slopen en dan heb ik dus alle hWND's van dat proces. Maar hoe kom ik er nu achter wat het "hoofd-hWnd" van (b.v.!) Internet Explorer is?
Ik heb me rot ge-googled en in MSDN gezocht en ben tot een paar mogelijke oplossingen gekomen, maar deze werken allemaal niet.
Ik heb al met GetWindow(eenhWnd, GW_OWNER) zitten stoeien, maar die geeft voor alle hWnd's van dat process 0 terug, terwijl ik volgens MSDN de owner van die hWnd zou moeten krijgen. Eventueel moet ik dan weer een lusje in duiken om daar weer de owner van te krijgen(?) enzovoorts, of heb ik dat al het "hoofd"-hWnd?
Ik kan geen gebruik maken van callbacks, om verschillende redenen waar ik hier niet op wil in gaan, mocht dat het eerste zijn wat je te binnen schoot
Ook GetParent geeft steeds 0 terug.
De oplossing die ik zoek zou het mooist zijn als ik voor regel 15 nog effe snel het "hoofd"-hWnd kon vinden.
Wat doe ik fout? Wie kan me helpen? Ik heb meer info, maar wil de post niet té lang maken
Als je meer wil weten hoor ik het wel.
Ik zit nu dus al 2 uur te zoeken op een stommiteit die ik maar niet opgelost krijg.
Ik maak gebruik van VB6 (geen offtopic gedoe daarover a.u.b.) en ben nu bezig met wat API calls om processen af te sluiten.
Ik weet dat ik met TerminateProcess een proces keihard kan sluiten, maar ik wil het wel graag netjes houden. Daarvoor gebruik ik het volgende:
Visual Basic:
1
| Call PostMessage(m_hWnd, WM_CLOSE, 0&, ByVal 0&) 'This call will send the message to close app |
waarbij m_hWnd de handle naar mijn Window is, WM_Close = 4. Dit werkt meestal wel, maar in geval van (bijvoorbeeld!) Internet Explorer niet. Deze opent namelijk een hele bult hWnd's (iedere tooltip/toolbar etc is een hWnd).
Nu wil ik mijn functie wel redelijk generiek houden, en dus niet keihard op de IEFrame class gaan zitten zoeken ofzo. Ik kan door alle hWnd's van proces heen lopen dus ook dat is het probleem niet.
Ik gebruik de volgende code om het hWnd via een ProcessID te verkrijgen:
Visual Basic:
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
| Private Function GethWndFromProcessID(hProcessIDToFind As Long) As Long Dim hWndDesktop As Long Dim hWndChild As Long Dim hWndChildProcessID As Long On Local Error GoTo GethWndFromProcessID_Error hWndDesktop = GetDesktopWindow() 'get the handle to the desktop hWndChild = GetWindow(hWndDesktop, GW_CHILD) 'get the first child under the desktop Do While hWndChild <> 0 'hwndchild will = 0 when no more child windows are found Call GetWindowThreadProcessId(hWndChild, hWndChildProcessID) 'get the ThreadProcessID of the window If hWndChildProcessID = hProcessIDToFind Then 'if it matches the target, exit returning that value GethWndFromProcessID = hWndChild Exit Do End If hWndChild = GetWindow(hWndChild, GW_HWNDNEXT) 'not found, so get the next hwnd Loop Exit Function GethWndFromProcessID_Error: GethWndFromProcessID = 0 Exit Function End Function |
Zoals je ziet op regel 15 spring ik uit de loop als ik een willekeurig hWND heb gevonden van het juiste proces. Deze exit kan ik eruit slopen en dan heb ik dus alle hWND's van dat proces. Maar hoe kom ik er nu achter wat het "hoofd-hWnd" van (b.v.!) Internet Explorer is?
Ik heb me rot ge-googled en in MSDN gezocht en ben tot een paar mogelijke oplossingen gekomen, maar deze werken allemaal niet.
Ik heb al met GetWindow(eenhWnd, GW_OWNER) zitten stoeien, maar die geeft voor alle hWnd's van dat process 0 terug, terwijl ik volgens MSDN de owner van die hWnd zou moeten krijgen. Eventueel moet ik dan weer een lusje in duiken om daar weer de owner van te krijgen(?) enzovoorts, of heb ik dat al het "hoofd"-hWnd?
Ik kan geen gebruik maken van callbacks, om verschillende redenen waar ik hier niet op wil in gaan, mocht dat het eerste zijn wat je te binnen schoot
Ook GetParent geeft steeds 0 terug.
De oplossing die ik zoek zou het mooist zijn als ik voor regel 15 nog effe snel het "hoofd"-hWnd kon vinden.
Wat doe ik fout? Wie kan me helpen? Ik heb meer info, maar wil de post niet té lang maken
[ Voor 9% gewijzigd door RobIII op 09-05-2003 17:06 ]
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
