Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.vbclassic > #7646 > unrolled thread
| Started by | "Wendelin Uez" <wuez@online.de> |
|---|---|
| First post | 2024-04-11 19:03 +0200 |
| Last post | 2024-04-20 19:46 +0200 |
| Articles | 15 — 3 participants |
Back to article view | Back to de.comp.lang.vbclassic
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
| From | "Wendelin Uez" <wuez@online.de> |
|---|---|
| Date | 2024-04-11 19:03 +0200 |
| Subject | Desktop 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]
| From | Ulrich Möller <knobbi38@arcor.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | "Wendelin Uez" <wuez@online.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | "Wendelin Uez" <wuez@online.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | Ulrich Möller <knobbi38@arcor.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | "Wendelin Uez" <wuez@online.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | "Wendelin Uez" <wuez@online.de> |
|---|---|
| Date | 2024-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]
| From | Klaus Ketelaer <usenet@ketelaer.de> |
|---|---|
| Date | 2024-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]
| From | "Wendelin Uez" <wuez@online.de> |
|---|---|
| Date | 2024-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