vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB & Windows API
Subclassing des Excel-Fensters mit VBA 
Autor: rocki
Datum: 30.05.05 14:04

Für einen Datenaustausch zwischen Excel und einer anderen Anwendung, soll Excel WM_COPYDATA-Nachrichten verarbeiten. Dazu habe ich ein VBA-Makro, das ein Subclassing für das Excel-Fenster realisiert. Der Datenaustausch funktioniert damit.

Problem: Sobald das Subclassing eingeschaltet ist, funktioniert die Titelleiste von Excel nicht mehr, d. h. ich bekomme z. B. keine Reaktion auf den Minimier([_]) -bzw. Schließe-Fenster-Button ([x]) . Schalte ich das Subclassing wieder aus, funktioniert die Titelleiste wieder. Mir ist klar, dass Nachrichten an den Non-Client-Bereich anders behandelt werden, als Nachrichten an den Client-Bereich eines Fensters, aber weiter verstehe ich das Problem leider nicht.

Hat jemand einen hilfreichen Hinweis ?

Danke.
Rocki
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: ModeratorMartoeng (Moderator)
Datum: 30.05.05 23:11

Hm, keine Ahnung wie Excel auf Subclassen reagiert und wie das aus VBA heraus am besten geht, aber es wäre vielleicht hilfreich ein wenig Code zu sehen.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: rocki
Datum: 31.05.05 09:42

Für das Abfangen der Nachrichten benutze ich das Prozedürchen do_sublass und die Funktion fWindowProc:
Public Sub do_subclass()
  lpPrevWndProc = SetWindowLong(Application.hWnd, GWL_WNDPROC, AddressOf _
    fWindowProc)
End Sub
 
Function fWindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As _
  Long, ByVal lParam As Long) As Long
    fWindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End Function
Sobald ich do_subclass aufrufe, funktioniert Excel ganz normal, meine Funktion fWindowProc bekommt die Nachrichten und leitet sie an die alte Prozedur lpPrevWndProc weiter. Nur wenn man auf die Titelleiste (z.B. auf den Minimierbutton [_]) klickt, reagiert Excel nicht mehr. Die Blockade kann gelöst werden, indem man z. B. das Fenster wechselt. Dann kann ich das Makro undo_subclass aufrufen, und alles ist wieder ok.
Public Sub undo_subclass()
  Call SetWindowLong(Application.hWnd, GWL_WNDPROC, lpPrevWndProc)
End Sub
Zur Deklaration benötige ich noch
Public Const GWL_WNDPROC = (-4)
Public lpPrevWndProc As Long
und die Deklaration der API-Funktionen
Declare Function CallWindowProc Lib "user32" Alias _
   "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As _
   Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As _
   Long) As Long
 
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
   (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As _
   Long) As Long
Danke für die viele Mühe !

Gruß Rocki
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: ModeratorMartoeng (Moderator)
Datum: 31.05.05 21:20

Hm, sehr mysteriös. Wird sich Excel wohl irgendwas bei denken. Kenne leider den Excel-Source nicht, sonst könnte man da schauen

Ginge es evtl., dass Du nicht Excel für den Nachrichtenaustausch nimmst?
Was ist das für ein Programm, mit dem Du Daten austauschst. Deines?


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: rocki
Datum: 01.06.05 10:24

Danke fürs Drüberschauen !

An der Konstellation - Datenaustausch zwischen Excel und dem Fremdprogramm über WM_COPYDATA-Nachrichten - kann ich leider nichts ändern. Auf den Quellcode des Fremprogramms habe ich keinen Zugriff. Ich muss 'nur' dafür sogen, dass Excel ständig auf Empfang steht.

Ist übrigens kein Excel-typisches Problem. Ich hab das gleiche auch mit Word und ArcGIS probiert.

Ciao und danke noch mal !
Gruß Rocki
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: ModeratorMartoeng (Moderator)
Datum: 01.06.05 23:35

Das andere Programm sendet direkt nur an das Excel-Hauptfenster? Wenn ja, warum eigentlich?

Ansonsten - keine Ahnung warum Excel die Leiste blockiert.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: Mortimer
Datum: 07.06.05 22:23

Das Problem wird vermutlich folgendes sein: Durch das Subclassing leitest Du die Befehle, die an das Hauptfenster von Excel gehen, in dein Programm um. Dabei handelt es sich wirklich nur um das Hauptfenster, nicht um Symbolleisten etc, sondern wirklich nur um den Rahmen (daher sind auch nur Min u Max-Button betroffen)

Da nun in deinem Programm nicht festgelegt ist, was beim Betätigen des Min-Buttons getan werden soll, passiert eben nichts. Der Befehl geht quasi ins Leere.

Probier einfach mal, für das min und max zwei Funktionen in deinem Programm zu realisieren.

Gruß Mortimer
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Subclassing des Excel-Fensters mit VBA 
Autor: ModeratorMartoeng (Moderator)
Datum: 08.06.05 13:50

Ne, das ist falsch. Die Nachrichten werden ja hinterher an die "alte" Prozedur weitergeleitet mit CallWindowProc.


vbarchiv.dll (Freeware), Tutorials uvm. auf http://www.martoeng.com.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2022 [email protected] Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel