Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: [vb6] hWnd exists?

JussiR [24.10.2008 11:19:01]

#

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.

Grez [24.10.2008 11:27:50]

#

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ä.

JussiR [24.10.2008 11:38:04]

#

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

Grez [24.10.2008 13:38:37]

#

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.

JussiR [24.10.2008 15:51:46]

#

joo kiitoksia. Kyllä mulla se GetDC palauttaa False jos ei ikkunaa löydy.

neau33 [24.10.2008 17:15:18]

#

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

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta