Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Umschreiben auf 64 Bit? Nepumuk

Forumthread: Umschreiben auf 64 Bit? Nepumuk

Umschreiben auf 64 Bit? Nepumuk
29.10.2021 18:11:07
Andreas
Option Explicit
Hallo von Nepumuk hab ich folgende Code, der allerdings für 32 bit gedacht ist. Gibts sowas auch für 64 bit Versionen?
Vielen Dank ;)
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
ByVal hWnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Any) As Long
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEMSUSERFORM_9 = "ThunderDFrame"

Private Sub UserForm_Initialize()
SendMessage FindWindow(GC_CLASSNAMEMSUSERFORM_9, Me.Caption), _
WM_SETICON, 0&, Image1.Picture.Handle
End Sub

Anzeige

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Umschreiben auf 64 Bit? Nepumuk
29.10.2021 18:28:40
volti
Hallo Andreas,
hier die Declares für 64 Bit:
Code:

[Cc]

Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal hwnd As LongPtr, _ ByVal wMsg As Long, _ ByVal wParam As LongPtr, _ lParam As Any) As LongPtr Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz

Anzeige
AW: Umschreiben auf 64 Bit? Nepumuk
29.10.2021 22:19:59
Andreas
Hallo KarlHeinz,
leider funktioniert der Code damit nicht :(..Hat vielleicht noch jemand eine Idee?
Der Code soll bewirken, dass in einem Userform oben in der Titelleiste des Forms ein Icon angezeigt wird.
Mit derzeitigem Code wird nur ein "NichtGefunden"Symbol" angezeigt.
Das Image1 habe ich als Ico in 16x16 hinterlegt.
Trotzdem vielen Dank....
Anzeige
AW: Umschreiben auf 64 Bit? Nepumuk
29.10.2021 23:26:26
volti
Hallo Andreas,
die Declares sind korrekt, bei einem UF-Nachbau werden bei mir alle Handles erfolgreich ermittelt und in der Titelleiste (leider nur) ein DOS-Icon angezeigt.
Ggf. weiß Nepumuk was dazu, ansonsten hilft hier nur mal die Mappe hochzuladen..
Gruß
Karl-Heinz
AW: Umschreiben auf 64 Bit? Nepumuk - offen owt
29.10.2021 23:28:30
volti
Offen gelassen
Anzeige
AW: Umschreiben auf 64 Bit? Nepumuk
30.10.2021 08:43:15
Nepumuk
Hallo Andreas,
1. Der genderte Code:

Option Explicit
Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
ByVal hwnd As LongPtr, _
ByVal wMsg As Long, _
ByVal wParam As LongPtr, _
ByVal lParam As Any) As LongPtr
Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As LongPtr
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEMSUSERFORM As String = "ThunderDFrame"
Private Sub UserForm_Initialize()
Dim lngptrFormHandle As LongPtr
lngptrFormHandle = FindWindowA(GC_CLASSNAMEMSUSERFORM, Caption)
Call SendMessageA(lngptrFormHandle, WM_SETICON, 0, Image1.Picture.Handle)
End Sub
2. Muss das Icon vom Typ .ico sein. Im Eigenschaftsfenster des Image-Controls siehst du das weil dann bei der Picture-Eigenschaft "(Symbol)" steht.
Gruß
Nepumuk
Anzeige
AW: Umschreiben auf 64 Bit? Nepumuk
31.10.2021 09:28:20
Andreas
Super, jetzt funktioniert das Ganze. VIelen Dank ihr beiden für Eure Bemühungen!
Macht immer wieder Spass, wenn am Ende was richtig funktioniert :)
AW: Zusatzinfo
30.10.2021 11:54:42
volti
Hallo,
meine Declare-Version hat nicht funktioniert bzw. setzt anstelle des gewünschten Icons das DOS-Icon, weil der letzte Parameter (lParam) der SendMessage-Function per Value übergeben werden muss. Das hatte ich vergessen.
Also entweder so ByVal lParam As Any in der Deklaration (wie bei Nepumuk)
oder so ByVal Image1.Picture.handle im Code selbst
Gruß
KH
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Umschreiben von VBA-Funktionen für 64 Bit


Schritt-für-Schritt-Anleitung

Um die FindWindow und SendMessage Funktionen in Excel VBA für 64-Bit zu deklarieren, befolge diese Schritte:

  1. Öffne den VBA-Editor: Drücke ALT + F11 in Excel.
  2. Füge ein neues Modul hinzu: Klicke mit der rechten Maustaste auf VBAProject (DeineDatei.xlsx), wähle Einfügen und dann Modul.
  3. Deklariere die Funktionen:
Option Explicit

Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As Any) As LongPtr

Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr
  1. Verwende die Funktionen in einem Sub: Hier ein Beispiel, wie du die Funktion verwenden kannst:
Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEMSUSERFORM As String = "ThunderDFrame"

Private Sub UserForm_Initialize()
    Dim lngptrFormHandle As LongPtr
    lngptrFormHandle = FindWindowA(GC_CLASSNAMEMSUSERFORM, Caption)
    Call SendMessageA(lngptrFormHandle, WM_SETICON, 0, Image1.Picture.Handle)
End Sub

Häufige Fehler und Lösungen

  1. Fehlende Deklaration von LongPtr: Stelle sicher, dass du LongPtr anstelle von Long verwendest, da dies für die 64-Bit-Version erforderlich ist.
  2. Falscher Bildtyp: Das Bild, das du verwendest, muss vom Typ .ico sein. Überprüfe, ob das Bild in den Eigenschaften des Controls korrekt gesetzt ist.
  3. SendMessage gibt nur ein "Nicht gefunden" Symbol zurück: Überprüfe die Klassennamen und die Fensterbezeichnung, um sicherzustellen, dass sie korrekt sind.

Alternative Methoden

Falls die oben genannten Methoden nicht funktionieren, kannst du auch die FindWindowEx Funktion verwenden. Diese bietet mehr Flexibilität, um Fensterhandle zu finden:

Private Declare PtrSafe Function FindWindowEx Lib "user32.dll" ( _
    ByVal hwndParent As LongPtr, _
    ByVal hwndChildAfter As LongPtr, _
    ByVal lpszClass As String, _
    ByVal lpszWindow As String) As LongPtr

Praktische Beispiele

Hier ist ein vollständiges Beispiel für ein UserForm, das ein Icon in der Titelleiste anzeigt:

Option Explicit

Private Declare PtrSafe Function SendMessageA Lib "user32.dll" ( _
    ByVal hwnd As LongPtr, _
    ByVal wMsg As Long, _
    ByVal wParam As LongPtr, _
    ByVal lParam As Any) As LongPtr

Private Declare PtrSafe Function FindWindowA Lib "user32.dll" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As LongPtr

Private Const WM_SETICON As Long = &H80
Private Const GC_CLASSNAMEMSUSERFORM As String = "ThunderDFrame"

Private Sub UserForm_Initialize()
    Dim lngptrFormHandle As LongPtr
    lngptrFormHandle = FindWindowA(GC_CLASSNAMEMSUSERFORM, Caption)
    Call SendMessageA(lngptrFormHandle, WM_SETICON, 0, Image1.Picture.Handle)
End Sub

Tipps für Profis

  • Verwende PtrSafe in deinen Deklarationen, um sicherzustellen, dass dein Code sowohl in 32-Bit als auch in 64-Bit Umgebungen funktioniert.
  • Überprüfe die API-Dokumentation für die user32.dll, um weitere nützliche Funktionen zu entdecken, die du in deinem VBA-Projekt verwenden kannst.
  • Halte deine VBA-Projekte gut dokumentiert, insbesondere wenn du mit externen Bibliotheken arbeitest.

FAQ: Häufige Fragen

1. Warum muss ich LongPtr verwenden? LongPtr ist notwendig, um die Speichermanagement-Unterschiede zwischen 32-Bit und 64-Bit Versionen von Windows zu berücksichtigen.

2. Kann ich den Code in einer 32-Bit Excel-Version verwenden? Ja, aber du musst die PtrSafe-Deklaration entfernen und Long anstelle von LongPtr verwenden.

3. Woher bekomme ich die Icons für mein UserForm? Icons können aus verschiedenen Quellen bezogen werden, achte darauf, dass sie im .ico Format vorliegen, um korrekt angezeigt zu werden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige