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 SubAihe on jo aika vanha, joten et voi enää vastata siihen.