VB 2005/2008: icoon van extern venster laden via handler

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • termination
  • Registratie: Juni 2007
  • Laatst online: 15-07 20:17
Hallo allmaal,

Ik probeer een soort startbalk-achtig programma te maken dat alle actieve vensters in een lijstje laat zien. Nu heb ik een mooi voorbeeld gevonden in VB6, maar dat is niet werkend te krijgen in VB2005/2008.

Dit is de situatie:
Ik heb een handler naar het venster dat op dat moment word toegevoegd aan de lijst. Die handler krijg ik via deze code:
code:
1
Dim hwndFirstTopLevel As Integer = GetWindow(GetDesktopWindow, GW_CHILD)

dan word de functie aangeroepen die alles laad, werkt perfect.
In die functie moet het bijbehorende icoon worden geladen, en daar gaat het mis.
Ik heb al icon.FromHandle geprobeerd, maar die handle verwijst naar het venster en niet naar het icoon.
Heeft iemand een idee hoe ik dit doe? ben er al uren voor aan het google-en, maar nog geen oplossing gevonden.

Groeten,
Thom.

Acties:
  • 0 Henk 'm!

  • CMG
  • Registratie: Februari 2002
  • Laatst online: 10-12-2024

CMG

Het is best simpel. Het werkt met SendMessage Win32 api. Als je even googled op de constant 'WM_GETICON', dan vind je direct een hoop info en voorbeelden.

Veel plezier!

NKCSS - Projects - YouTube


Acties:
  • 0 Henk 'm!

  • termination
  • Registratie: Juni 2007
  • Laatst online: 15-07 20:17
Heb het gevonden, alleen werkt dit alleen met de drawiconex API. De code is hier te zien:
http://www.tech-archive.n....winapi/2004-12/0547.html
iemand een idee hoe ik dit kan realiseren met een picturebox??

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
termination schreef op dinsdag 11 november 2008 @ 09:21:
iemand een idee hoe ik dit kan realiseren met een picturebox??
De handle van de picturebox opgeven i.p.v. de handle van het form :?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • termination
  • Registratie: Juni 2007
  • Laatst online: 15-07 20:17
sorry, werk niet zo vaak met hadles ;)
maar de handle van de picturebox opgeven werkt dus niet.
klopt dit?
[code]
Call DrawIconEx(PictureBox1.Handle, 0, LoopMode * 32, hIcon, 0, 0, 0, 0, DI_NORMAL)
[/code]

nvw, moest dit toevoegen voor een hDC:
code:
1
2
Dim hDC As Long
hDC = Me.PictureBox1.CreateGraphics.GetHdc.ToInt32()

hij tekent dus niet de icoontjes van alle programma's. er verschijnt één keer het icoon van het programma zelf, een paar lege ruimtes en 3 folder icoontjes, terwijl er maar 1 folder is. dit is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
    Private Sub FindTopLevelWindows(ByRef hwnd As Integer, ByVal lst As ListBox)
        Dim strWindowText As String
        Dim hIcon As Long
        Dim LoopMode As Long
        Dim counter As Long
        Dim counterx As Long
        Dim countery As Long
        Dim Form As New Form1
        Dim hDC As Long
        hDC = Me.progIco.CreateGraphics.GetHdc.ToInt32()
        'Loop through all windows in the system and throw the qualifying ones to my list.
        Do Until hwnd.Equals(0)
            If IsVisibleTopWnd(hwnd) Then
                strWindowText = WindowTextFromWnd(hwnd)
                'The Program Manager is always on the Top-Level list, exclude it.
                If Not strWindowText.Equals("Program Manager") Then
                    lst.Items.Add(strWindowText)
                End If
                For LoopMode = ICON_SMALL To ICON_SMALL2
                    hIcon = SendMessage(hwnd, WM_GETICON, ICON_SMALL, 0&)
                    If (hIcon) Then
                        Dim myicon As System.Drawing.Icon = Icon.FromHandle(hIcon)
                        Call DrawIconEx(hDC, counterx * 32, countery * 32, hIcon, 0, 0, 0, 0, DI_NORMAL)
                        Call DestroyIcon(hIcon)
                        counterx = counterx + 1
                        If counterx > 10 Then
                            counterx = 0
                            countery += 1
                        End If
                    End If
                Next LoopMode
                counter += 1
            End If
            hwnd = GetWindow(hwnd, GW_HWNDNEXT)
        Loop
    End Sub

zoals je ziet staan er een paar counters in om bij te houden wat er precies gebeurd.

[ Voor 171% gewijzigd door termination op 11-11-2008 19:15 ]


Acties:
  • 0 Henk 'm!

  • termination
  • Registratie: Juni 2007
  • Laatst online: 15-07 20:17
Zal even duidelijk maken wat er moet komen. Ik wil een tasklist hebben zoals te zien in EShell(VB6)
is dit mogenlijk in VB2008(vast wel, maar hoe precies?)
Wat heb ik al:
Ik heb al een listbox met alle actieve vensters erin, maar nu nog een lijstje met icoontjes zoals in eshell te zien is.

[ Voor 87% gewijzigd door termination op 11-11-2008 19:19 ]

Pagina: 1