En osannu suomeks otsikkoa mutta.. Kuinka voin tarkistaa onko jokin tietty hWnd vielä olemassa? Mun ohjelma ottaa sen hWnd:n WindowFromPointilla, mutta ikkuna josta hWnd otetaan saatetaan vaikka sulkea ja mun ohjelman pitäis tietää ettei sitä enää oo.
Mihin sitten käytät sitä hWnd:tä? Meinaan se varmaan palauttaa tiedon että pyytämäsi asia epäonnistui, jos ikkuna on kadonnut.
Muutenkin olisi hyödytöntä ensin tarkistaa että onko hWnd vielä olemassa ja vasta sitten suorittaa toiminto, koska se voisi kuitenkin kadota tarkistuksen ja suorittamisen välissä.
GetDC:tä käytän yhden kerran ohjelmassa heti tuon WindowFromPointin jälkeen. Sen jälkeen vaan GetPixel siitä DC:stä eli siinä ei tule virhettä.. Tässä ohjelmassa ei haittaa vaikka tarkistus menisi yli 5 kertaa peräkkäin pieleen.
Mikäs tämä IsWindow funktio on? Ei taida saada VB:hen? http://msdn.microsoft.com/en-us/library/ms633528(VS.85).aspx
Eli käytät vaan sitä GetDC:tä joka kerta uudestaan kun haluat tietää onko ikkuna vielä olemassa. Jos ikkunaa ei ole, niin GetDC palauttaa 0.
Itse tekisin niin, että kutsuisin GetDC:tä aina ennen kuin pyöräyttelen getpixelit läpi, ainakin jos siitä ei kohtuutonta tehohäviötä tulisi (ja tarvittaessa ReleaseDC niiden jälkeen). En nyt saanut kyllä ikkunan DC:tä vaihtumaan lennossa, mutta en toisaalta huomannut dokumentaatiossa takeita että se ei voisi vaihtua. Eli en osaa varmaksi sanoa suuntaan enkä toiseen.
joo kiitoksia. Kyllä mulla se GetDC palauttaa False jos ei ikkunaa löydy.
Moikka JussiR!
tässä pieni kyhäelmä, jolla voi testailla vaikka kyhäelmän toimivuutta...
'moduuliin: Option Explicit Private Declare Function GetWindowThreadProcessId Lib "user32" _ (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long Private Declare Function EnumWindows Lib "user32" _ (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean Private ProcWinHandle As Long Private ProcessHandle As Long Public Function GetProcessWindowHandle( _ ProcID As Long) As Long ProcessHandle = ProcID ProcWinHandle = 0 EnumWindows AddressOf EnumCallBack, 0& GetProcessWindowHandle = ProcWinHandle End Function Private Function EnumCallBack(ByVal hwnd As Long, _ ByVal lParam As Long) As Boolean Dim pid As Long GetWindowThreadProcessId hwnd, pid If pid = ProcessHandle Then ProcWinHandle = hwnd Else EnumCallBack = True End If End Function
' formiin referenssi: ' Microsoft WMI Scripting v1.2 Library ' (C:\WINDOWS\System32\wbem\wbemdisp.TLB) Private Declare Function IsWindow Lib "user32" _ (ByVal hwnd As Long) As Long Private Declare Function IsWindowVisible Lib "user32" _ (ByVal hwnd As Long) As Long Private Declare Function IsWindowEnabled Lib "user32" _ (ByVal hwnd As Long) As Long Private Sub Command1_Click() ReDim fwhWnd(0) As Long Dim i As Integer Dim prosessi, prosessit Set prosessit = GetObject _ ("winmgmts:{impersonationLevel=impersonate}") _ .InstancesOf("Win32_Process") For Each prosessi In prosessit With prosessi If LCase(.Name) = "notepad.exe" Then ReDim Preserve fwhWnd(i) fwhWnd(i) = GetProcessWindowHandle(.processId) i = i + 1 End With Next Set prosessit = Nothing For i = 0 To Ubound(fwhWnd) If IsWindow(fwhWnd(i)) <> 0 Then MsgBox "JEE! Ikkunamme on olemassa..." Else MsgBox "YÄÄ! Ikkunaa ei ole olemassa..." Erase fwhWnd: Exit Sub End If If IsWindowVisible(fwhWnd(i)) <> 0 Then MsgBox "JEE! Ikkunamme on näkyvä..." Else MsgBox "YÄÄ! Ikkuna ei ole näkyvä..." Erase fwhWnd: Exit Sub End If If IsWindowEnabled(fwhWnd(i)) <> 0 Then MsgBox "JEE! Ikkunaamme voi käpistellä..." Else MsgBox "YÄÄ! Ikkunaa ei voi käpistellä..." End If Next i Erase fwhWnd End Sub
Aihe on jo aika vanha, joten et voi enää vastata siihen.