| |
VB & Windows APISubclassing 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 | |
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-FunktionenDeclare 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 | |
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 | |
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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats TOP! Unser Nr. 1
Neu! sevDataGrid 3.0
Mehrspaltige Listen, mit oder ohne DB-Anbindung. Autom. Sortierung, Editieren von Spalteninhalten oder das interaktive Hinzufügen von Datenzeilen sind ebenso möglich wie das Erstellen eines Web-Reports. Weitere Infos
|