Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.vbclassic > #7646 > unrolled thread

Desktop handle

Started by"Wendelin Uez" <wuez@online.de>
First post2024-04-11 19:03 +0200
Last post2024-04-20 19:46 +0200
Articles 15 — 3 participants

Back to article view | Back to de.comp.lang.vbclassic


Contents

  Desktop handle "Wendelin Uez" <wuez@online.de> - 2024-04-11 19:03 +0200
    Re: Desktop handle Ulrich Möller <knobbi38@arcor.de> - 2024-04-12 21:53 +0200
      Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-13 10:30 +0200
        Re: Desktop handle "Wendelin Uez" <wuez@online.de> - 2024-04-13 11:04 +0200
          Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-13 19:06 +0200
            Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-13 19:15 +0200
            Re: Desktop handle "Wendelin Uez" <wuez@online.de> - 2024-04-14 18:35 +0200
              Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-14 20:46 +0200
        Re: Desktop handle Ulrich Möller <knobbi38@arcor.de> - 2024-04-13 13:35 +0200
    Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-17 11:06 +0200
      Re: Desktop handle "Wendelin Uez" <wuez@online.de> - 2024-04-17 16:07 +0200
        Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-17 19:30 +0200
          Re: Desktop handle "Wendelin Uez" <wuez@online.de> - 2024-04-19 13:44 +0200
            Re: Desktop handle Klaus Ketelaer <usenet@ketelaer.de> - 2024-04-20 00:43 +0200
              Re: Desktop handle "Wendelin Uez" <wuez@online.de> - 2024-04-20 19:46 +0200

#7646 — Desktop handle

From"Wendelin Uez" <wuez@online.de>
Date2024-04-11 19:03 +0200
SubjectDesktop handle
Message-ID<uv954n$1pung$1@dont-email.me>
Ich möchte gerne u.a. die Icon-Positionen des Desktops auslesen können und 
bin zur Ermittlung des Desktop-Handles auf die beiden folgenden 
Code-Beispiele gestoßen:

    hDesk = FindWindow("progman", vbNullString)
    hDesk = FindWindowEx(hDesk, 0, "SHELLDLL_DefView", vbNullString)
    hDesk = FindWindowEx(hDesk, 0, "SysListView32", "FolderView")


    hDesk = FindWindow("progman", "Program Manager")
    hDesk = GetWindow(hDesk, GW_CHILD)
    hDesk = GetWindow(hDesk, GW_CHILD)

In beiden Beispielen geht der jeweils 2. Aufruf schief und liefert null 
zurück.
Andere Aufrufe von FindWindow bzw. FindWindowEx in meinem Programm 
funktionieren dagegegen.

Was kann da falsch sein? 

[toc] | [next] | [standalone]


#7652

FromUlrich Möller <knobbi38@arcor.de>
Date2024-04-12 21:53 +0200
Message-ID<uvc3ft$2hk27$1@dont-email.me>
In reply to#7646
Hallo Wendelin,

Am 11.04.2024 um 19:03 schrieb Wendelin Uez:
> Ich möchte gerne u.a. die Icon-Positionen des Desktops auslesen

das müßte man auch relativ einfach per UIAutomation lösen können. Da 
sparst du dir die Windows API Aufrufe und über die COM Schnittstelle 
läßt sich das einfach in VBA einbinden.

Die Icons sind einfach die Childs von "Desktop"(SysListView32) unterhalb 
von "Program Manager" (Program). Die ClassNames in Klammern.

Das läßt sich innerhalb der UIAutomation einfach adressieren und 
durchlaufen.Schau mal hiernach einer Helper-Classe:
https://github.com/mhumpher/UIAutomation_VBA/blob/master/UIA_Wrapper.cls

und dann interessiert dich die Property "BoundingRectangle".

Ein wichtiges Tool ist Inspect.exe, womit du dir alle Daten anzeigen 
lassen kannst.

Gruß Ulrich


[toc] | [prev] | [next] | [standalone]


#7653

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-13 10:30 +0200
Message-ID<uvdfqk$hb05$1@solani.org>
In reply to#7652
Am 12.04.2024 um 21:53 schrieb Ulrich Möller:
> Hallo Wendelin,
Hallo Ulrich

> Am 11.04.2024 um 19:03 schrieb Wendelin Uez:
>> Ich möchte gerne u.a. die Icon-Positionen des Desktops auslesen
> 
> das müßte man auch relativ einfach per UIAutomation lösen können. Da 
> sparst du dir die Windows API Aufrufe und über die COM Schnittstelle 
> läßt sich das einfach in VBA einbinden.
> 
> Die Icons sind einfach die Childs von "Desktop"(SysListView32) unterhalb 
> von "Program Manager" (Program). Die ClassNames in Klammern.
> 
> Das läßt sich innerhalb der UIAutomation einfach adressieren und 
> durchlaufen.Schau mal hiernach einer Helper-Classe:
> https://github.com/mhumpher/UIAutomation_VBA/blob/master/UIA_Wrapper.cls
> 
> und dann interessiert dich die Property "BoundingRectangle".
> 
> Ein wichtiges Tool ist Inspect.exe, womit du dir alle Daten anzeigen 
> lassen kannst.

Wenn das System ein kaputtes Handle zurück liefert, dann muss
man sich darum kümmern, besonders wenn es sich um ein eminent
wichtiges Handle handelt.

Mal abgesehen davon, dass es viele (bessere) Möglichkeiten gibt,
die auf dem Desktop/Program abgelegten Icons zu ermitteln;

Wenn ich eine Fensterliste brauche, dann nutze ich ein paar
Zeilchen eigenen Code, wie z.B.

hWnd = GetWindow(GetDesktopWindow(), GW_HWNDFIRST)
Do
   ...
   hWnd = GetWindow(hWnd, GW_HWNDNEXT)
Loop Until hWnd = 0

Das geht jedoch nur, wenn ich keine kaputten Handles vom System
zurück bekomme. Darum hat das Priorität.

Statt dessen etwas einzubinden, bei dem bereits die Requirements
bei mir eine Panikattacke auslösen halte ich für suboptimal.

' Requirements:
' UIAuotmationClient (UIAutomationCore.dll) (this is the core UI dll)
' Microsoft Scripting Runtime (scrrun.dll) (this is mainly for using 
dictionaries)
' AutoItX3 1.0 Type Library (AutoItX3.dll) (additional automation 
capabilities)
' Miscrosoft VBScript Regular Expression (vbscript.dll\3)

Zudem: VBA != VB...

Gruß Klaus

[toc] | [prev] | [next] | [standalone]


#7655

From"Wendelin Uez" <wuez@online.de>
Date2024-04-13 11:04 +0200
Message-ID<uvdhrf$2u3ku$1@dont-email.me>
In reply to#7653
> Wenn ich eine Fensterliste brauche, dann nutze ich ein paar
> Zeilchen eigenen Code, wie z.B.
>
> hWnd = GetWindow(GetDesktopWindow(), GW_HWNDFIRST)
> Do
>   ...
>   hWnd = GetWindow(hWnd, GW_HWNDNEXT)
> Loop Until hWnd = 0
>
> Das geht jedoch nur, wenn ich keine kaputten Handles vom System
> zurück bekomme. Darum hat das Priorität.

Habe ich jetzt auch probiert und die Aufrufe entzerrt:
GetDesktopWindow() liefert noch ein Handle, aber GW_HWNDFIRST schon nicht 
mehr und trotzdem  mit GetLastError=0

[toc] | [prev] | [next] | [standalone]


#7657

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-13 19:06 +0200
Message-ID<uvee32$hq5s$1@solani.org>
In reply to#7655
Am 13.04.2024 um 11:04 schrieb Wendelin Uez:
> 
>> Wenn ich eine Fensterliste brauche, dann nutze ich ein paar
>> Zeilchen eigenen Code, wie z.B.
>>
>> hWnd = GetWindow(GetDesktopWindow(), GW_HWNDFIRST)
>> Do
>>   ...
>>   hWnd = GetWindow(hWnd, GW_HWNDNEXT)
>> Loop Until hWnd = 0
>>
>> Das geht jedoch nur, wenn ich keine kaputten Handles vom System
>> zurück bekomme. Darum hat das Priorität.
> 
> Habe ich jetzt auch probiert und die Aufrufe entzerrt:
> GetDesktopWindow() liefert noch ein Handle, aber GW_HWNDFIRST schon 
> nicht mehr und trotzdem  mit GetLastError=0
> 

Wie das Leben so spielt. Manchmal findet man nichts, und
das ist dann auch kein Fehler.

Hier sollte man schon eher etwas finden, denn die Desktop-Icons
liegen auf dem Program...

Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, 
ByVal wCmd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" 
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Const GW_HWNDFIRST = 0
Private Const GW_HWNDNEXT = 2

Private hProgman        As Long

Private Sub Form_Load()
   Dim hwnd          As Long

   hProgman = FindWindow(vbNullString, "Program Manager")

   hwnd = GetWindow(hProgman, GW_HWNDFIRST)
   Do
     Debug.Print hwnd
     hwnd = GetWindow(hwnd, GW_HWNDNEXT)
   Loop Until hwnd = 0

End Sub


[toc] | [prev] | [next] | [standalone]


#7658

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-13 19:15 +0200
Message-ID<uveekb$hq5s$2@solani.org>
In reply to#7657
Mal rein vorsorglich:

Die Daten zu einem Fenster ermittelt man so: :-) :-) :-)

Private Sub RegisterWindow(ByVal hWindow As Long)
   Dim hParent         As Long
   Dim hTask           As Long
   Dim szTitle         As String
   Dim szClass         As String
   Dim lStyle          As Long

   Dim iLength         As Integer
   Dim lResult         As Long

   ' Eltern-Fenster
   hParent = GetParent(hWindow)

   ' Festerstil
   lStyle = GetWindowLong(hWindow, GWL_STYLE)

   'Titel des Fenster auslesen
   szTitle = Space$(255)
   iLength = GetWindowText(hWindow, szTitle, 255)
   szTitle = Left$(szTitle, iLength)

   szClass = Space$(255)
   iLength = GetClassName(hWindow, szClass, Len(szClass))
   szClass = Left$(szClass, iLength)

   'Task-ID ermitteln
   lResult = GetWindowThreadProcessId(hWindow, hTask)

   m_Windows = m_Windows + 1
   ReDim Preserve m_Window(m_Windows)

   m_Window(m_Windows).hWnd = hWindow
   m_Window(m_Windows).hParent = hParent
   m_Window(m_Windows).Style = lStyle
   m_Window(m_Windows).Title = szTitle
   m_Window(m_Windows).Class = szClass
   m_Window(m_Windows).Task = hTask

   m_Window(m_Windows).Locked = False
   m_Window(m_Windows).Borders = (lStyle And WS_BORDER) = WS_BORDER
   m_Window(m_Windows).Visible = (lStyle And WS_VISIBLE) = WS_VISIBLE

   lResult = GetWindowRect(hWindow, m_Window(m_Windows).WindowPos)
End Sub

[toc] | [prev] | [next] | [standalone]


#7659

From"Wendelin Uez" <wuez@online.de>
Date2024-04-14 18:35 +0200
Message-ID<uvh0kn$3npu6$1@dont-email.me>
In reply to#7657
Danke für den Code, aber die Folge

hProgman = FindWindow(vbNullString, "Program Manager")
hwnd = GetWindow(hProgman, GW_HWNDFIRST)
:::
hwnd = GetWindow(hwnd, GW_HWNDNEXT)

hangelt sich zwar durch die Top-Window-Fensterliste, aber abgesehen von 
diversen System-Fenstern  sind das nicht die Desktop-Icons.

Wenn ich in dem Fenster mit dem Titel "Program Manager"  mit 
hWnd=GetWindows(hWnd,GW_CHILD) dessen erstes Child-Window holen will, dann 
kommt hWnd wie gehabt wieder mit Null zurück.

seufz 

[toc] | [prev] | [next] | [standalone]


#7660

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-14 20:46 +0200
Message-ID<uvh8at$j7nq$1@solani.org>
In reply to#7659
Am 14.04.2024 um 18:35 schrieb Wendelin Uez:
> Danke für den Code, aber die Folge
> 
> hProgman = FindWindow(vbNullString, "Program Manager")
> hwnd = GetWindow(hProgman, GW_HWNDFIRST)
> :::
> hwnd = GetWindow(hwnd, GW_HWNDNEXT)
> 
> hangelt sich zwar durch die Top-Window-Fensterliste, aber abgesehen von 
> diversen System-Fenstern  sind das nicht die Desktop-Icons.
> 
> Wenn ich in dem Fenster mit dem Titel "Program Manager"  mit 
> hWnd=GetWindows(hWnd,GW_CHILD) dessen erstes Child-Window holen will, 
> dann kommt hWnd wie gehabt wieder mit Null zurück.
> 
> seufz

Vielleicht gehst Du dein Unterfangen ja auch suboptimal an.

Würde ich nur die Positionen der auf dem Desktop abgelegten
Icons ermitteln wollen, dann würde ich vermutlich einfach die
Icons aus ssfDESKTOP und/oder ssfCOMMONDESKTOPDIRECTORY auslesen
und mir dann mit FindWinwow(Ex) die Daten zum Fenster holen.

Vermutlich ist der ganze Krempel aber auch in der Registry zu
finden.

Ich habe davon wenig Ahnung, denn alles, was ich mit den Icons
anstelle, das ist, sie alle bei jedem Systemstart zu löschen.
Ich hasse Icons auf dem Desktop. Igitigitt...



[toc] | [prev] | [next] | [standalone]


#7656

FromUlrich Möller <knobbi38@arcor.de>
Date2024-04-13 13:35 +0200
Message-ID<uvdqm4$2vo2v$1@dont-email.me>
In reply to#7653
Hallo Klaus,

Am 13.04.2024 um 10:30 schrieb Klaus Ketelaer:
> Statt dessen etwas einzubinden, bei dem bereits die Requirements
> bei mir eine Panikattacke auslösen halte ich für suboptimal.
> 
> ' Requirements:
> ' UIAuotmationClient (UIAutomationCore.dll) (this is the core UI dll)

Es wird lediglich die UIAutomationCore.dll benötigt und hierbei ist es 
egal, ob VBA oder VB. Ich habe das letztens in einer MS Access 
verwendet. Es ist einfach zu handhaben und macht genau das, was es soll.

Da UIAutomation auch von den Tools für Barrierefreiheit verwendet wird, 
sollte es auch stabil sein.

[toc] | [prev] | [next] | [standalone]


#7666

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-17 11:06 +0200
Message-ID<uvo3es$4dgq$3@solani.org>
In reply to#7646
Am 11.04.2024 um 19:03 schrieb Wendelin Uez:
> Ich möchte gerne u.a. die Icon-Positionen des Desktops auslesen können 
> und bin zur Ermittlung des Desktop-Handles auf die beiden folgenden 
> Code-Beispiele gestoßen:

Ich sitze jetzt seit 2 Tagen an den blöden Icons und komme nicht
weiter. Die Positionen sind kein Problem, aber ich komme einfach
nicht an die Texte heran...

Vielleicht hilft es dir ja:

Private Function EnumIcons(ByVal lSysListView As Long) As Long
   Dim pid             As Long
   Dim tid             As Long
   Dim lpSysShared     As Long
   Dim hProcess        As Long
   Dim lWritten        As Long
   Dim i               As Integer
   Dim pt              As POINTAPI

   m_Icons = SendMessage(lSysListView, LVM_GETTITEMCOUNT, 0, 0&)
   ReDim m_Icon(m_Icons)

   tid = GetWindowThreadProcessId(lSysListView, pid)
   lpSysShared = GetMemSharedNT(pid, Len(pt), hProcess)
   WriteProcessMemory hProcess, ByVal lpSysShared, pt, Len(pt), lWritten
   For i = 0 To m_Icons - 1
     SendMessage hSysListView, LVM_GETITEMPOSITION, i, ByVal lpSysShared
     ReadProcessMemory hProcess, ByVal lpSysShared, pt, Len(pt), lWritten

     m_Icon(i).X = pt.X
     m_Icon(i).Y = pt.Y
     ' m_Icon(i).Text = Ich bin einfach zu blöd den Text auszulenen...
   Next i
   FreeMemSharedNT hProcess, lpSysShared, Len(pt)

End Function

[toc] | [prev] | [next] | [standalone]


#7667

From"Wendelin Uez" <wuez@online.de>
Date2024-04-17 16:07 +0200
Message-ID<uvop9m$1luck$2@dont-email.me>
In reply to#7666
Vielen Dank. Wenn ich das richtig sehe, dann soll lSyslistView das hWnd des 
SystemListView-Objekts sein, aber genau an das komme ich ja leider nicht 
einmal, und ich weiß auch nicht warum. 

[toc] | [prev] | [next] | [standalone]


#7669

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-17 19:30 +0200
Message-ID<uvp0ve$2he9$1@solani.org>
In reply to#7667
Am 17.04.2024 um 16:07 schrieb Wendelin Uez:
> Vielen Dank. Wenn ich das richtig sehe, dann soll lSyslistView das hWnd 
> des SystemListView-Objekts sein, aber genau an das komme ich ja leider 
> nicht einmal, und ich weiß auch nicht warum.

   hProgman = FindWindow(vbNullString, "Program Manager")
   hTemp = FindWindowEx(hProgman, 0, "SHELLDLL_defVIEW", vbNullString)
   hSysListView = FindWindowEx(hTemp, 0, "SysListView32", vbNullString)

[toc] | [prev] | [next] | [standalone]


#7670

From"Wendelin Uez" <wuez@online.de>
Date2024-04-19 13:44 +0200
Message-ID<uvu7j6$33qbv$2@dont-email.me>
In reply to#7669
"Klaus Ketelaer" <usenet@ketelaer.de> schrieb im Newsbeitrag 
news:uvp0ve$2he9$1@solani.org...
> Am 17.04.2024 um 16:07 schrieb Wendelin Uez:
>> Vielen Dank. Wenn ich das richtig sehe, dann soll lSyslistView das hWnd 
>> des SystemListView-Objekts sein, aber genau an das komme ich ja leider 
>> nicht einmal, und ich weiß auch nicht warum.
>
>   hProgman = FindWindow(vbNullString, "Program Manager")
>   hTemp = FindWindowEx(hProgman, 0, "SHELLDLL_defVIEW", vbNullString)
>   hSysListView = FindWindowEx(hTemp, 0, "SysListView32", vbNullString)


Danke Klaus, aber da liegt ja mein Eingangs-Problem, daß das bei mir unter 
WIN8.1 nicht funktioniert, hTemp=0 und Err.dllError liefert ebenfalls null 
zurück. Unter WIN10 kein Problem, aber das nutzt mir nichts.

Ich könnte jetzt WIN8.1 und den ganzen sonstigen Krempel nochmals neu 
installieren und hoffen, daß das dann doch noch funktionieren könnte, aber 
soviel Zeit habe ich nicht mal als Rentner :-), also entfällt in meinem Prog 
halt das Feature "DesktopIcons".

Mein nächster neuer Rechner wird sowieso nicht mehr unter Windows laufen, 
und WINE wird wahrscheinlich noch viel mehr Probleme machen mit Windows-DLLs 
(was mich bisher vom Umstieg auf Linux abgehalten hat, gibt's eigentlich 
eine WINE-NG?).

Gruß
wuez 

[toc] | [prev] | [next] | [standalone]


#7671

FromKlaus Ketelaer <usenet@ketelaer.de>
Date2024-04-20 00:43 +0200
Message-ID<uvus1n$5lob$1@solani.org>
In reply to#7670
Am 19.04.2024 um 13:44 schrieb Wendelin Uez:
> 
> Danke Klaus, aber da liegt ja mein Eingangs-Problem, daß das bei mir 
> unter WIN8.1 nicht funktioniert, hTemp=0 und Err.dllError liefert 
> ebenfalls null zurück. Unter WIN10 kein Problem, aber das nutzt mir nichts.
> 
> Ich könnte jetzt WIN8.1 und den ganzen sonstigen Krempel nochmals neu 
> installieren und hoffen, daß das dann doch noch funktionieren könnte, 
> aber soviel Zeit habe ich nicht mal als Rentner :-), also entfällt in 
> meinem Prog halt das Feature "DesktopIcons".

Das ist ja Quark. Deine Probleme können eigentlich garnicht bestehen.
Irgend etwas machst Du falsch. Würde FindWindowEx bei dir nicht
funktionieren, oder es gäbe kein "SHELLDLL_defVIEW" dann würde dein
ganzes System nicht laufen. Ich würde einfach noch mal alle Api-
Deklarationen prüfen.


> Mein nächster neuer Rechner wird sowieso nicht mehr unter Windows 
> laufen, und WINE wird wahrscheinlich noch viel mehr Probleme machen mit 
> Windows-DLLs (was mich bisher vom Umstieg auf Linux abgehalten hat, 

Ich halte das für eine wirklich gut durchdachte Idee, auf Linux
umzusteigen, wenn man den ganzen Tag mit VB codet. Unter Wine
läuft sicherlich alles viel besser...

> gibt's eigentlich eine WINE-NG?).
Natürlich...

[toc] | [prev] | [next] | [standalone]


#7672

From"Wendelin Uez" <wuez@online.de>
Date2024-04-20 19:46 +0200
Message-ID<v01ir4$3tql2$5@dont-email.me>
In reply to#7671
>> Mein nächster neuer Rechner wird sowieso nicht mehr unter Windows laufen, 
>> und WINE wird wahrscheinlich noch viel mehr Probleme machen mit 
>> Windows-DLLs (was mich bisher vom Umstieg auf Linux abgehalten hat,
>
> Ich halte das für eine wirklich gut durchdachte Idee, auf Linux
> umzusteigen, wenn man den ganzen Tag mit VB codet. Unter Wine
> läuft sicherlich alles viel besser...

Ich muß nix mehr kommerziell machen, nur noch aus Spaß. 

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.vbclassic


csiph-web