Anzeige
Archiv - Navigation
1708to1712
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Userform an Mausposition öffnen

Userform an Mausposition öffnen
05.09.2019 12:08:30
Julius
Hallo zusammen,
ich hab da mal wieder ein Problem, bei dem ich nicht weiter komme.
Ich möchte eine Userform an der Position öffnen, an der der Mauszeiger ist.
Das habe ich bereits:
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _
ByVal hwnd As Long, ByVal hWndInsertAfter As LongPtr, _
ByVal X As Long, ByVal Y As Long, ByVal cx As LongPtr, _
ByVal cy As Long, ByVal wFlags As Long) As LongPtr
Private Declare PtrSafe Function GetCursorPos Lib "user32" ( _
lpPoint As POINTAPI) As LongPtr
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Private Type POINTAPI
X As Long
Y As Long
End Type
Und:
Private Sub UserForm_Activate()
Dim Mausposition As POINTAPI
Dim hwnd&
hwnd = FindWindow(vbNullString, Me.Caption)
GetCursorPos Mausposition
SetWindowPos hwnd, 0, Mausposition.X, Mausposition.Y, 0, 0, _
SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_FRAMECHANGED Or SWP_NOSIZE
Die Userform wird über einen Comandbutton aufgerufen. Da der Button in einer Hauptuserform mehrmals an verschiedenen Stellen zur Datumsübergabe benutzt wird, möcht eich das auch die secundäre Userform sich in der nähe des gedrückten Buttons öffnen. Hier denke ich ist die Mausposition die beste Wahl.
Aber leider bekomme ich den Fehler das FindWindow falsch deklariert ist bzw der Typ falsch ist.
Ich musste den mit PtrSafe und LongPtr umstellen damit er auf 32/64bit Systemen läuft.
Wo liegt denn der Fehler den ich nicht sehe? :D
Vielen DAnk

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform an Mausposition öffnen
05.09.2019 13:12:32
Daniel
HI
wenn sich der Button in einer Userform befindet, kannst du Position des Mauszeigers auch über folgende Kette ermitteln, ohne über die Windows-API zu gehen:
1. Position der Hauptuserform +
2. Position des Buttons innerhalb der Userform +
3. Position des Mauszeigers über dem Button bei Klick.
für 1. und 2 nimmst du die .Top und .Left-Werte des Buttons und der Userform
3. kannst du im MouseUp-Event des Buttons abfragen über die Variablen X und Y, wobei X = Left und Y = Top ist)
dann alle 3 Werte zusammen addieren und ggf einen Korrekturwert für Rahmenbreite und Überschrift hinzufügen.
Gruß Daniel
Anzeige
AW: Userform an Mausposition öffnen
05.09.2019 14:17:04
Julius
Cool ich danke dir, das versuche ich mal. Auf diesen Weg bin ich gar nicht gekommen.
Aber ich verstehe nicht, wo der Fehler in dem Code liegt, mit dem ich es versucht habe. Ich hatte auch versucht die Variable mit einem anderen Datentypen zu tauschen. Das ging aber auch nicht.
AW: Userform an Mausposition öffnen
05.09.2019 15:16:11
Julius
Okay, bevor ich den zweiten Weg angehe, wollte ich dennoch einmal schauen warum das mit der API nicht geht. Mir sind noch ein paar Fehler aufgefallen. Soweit funktioniert es auch, jedoch öffnet sich die Userfrm nicht an der Position des Mauszeigers sondern Mittig am oberen Bildschirmrand. ^^
Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
Private Declare PtrSafe Function SetWindowPos Lib "user32" ( _
ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
ByVal X As LongPtr, ByVal Y As LongPtr, ByVal cx As LongPtr, _
ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
Private Declare PtrSafe Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As LongPtr
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_NOZORDER = &H4
Private Const SWP_NOREDRAW = &H8
Private Const SWP_NOACTIVATE = &H10
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_SHOWWINDOW = &H40
Private Const SWP_HIDEWINDOW = &H80
Private Const SWP_NOCOPYBITS = &H100
Private Const SWP_NOOWNERZORDER = &H200
Private Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Private Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Private Type POINTAPI
X As LongPtr ' vergessen X & Y auch als LongPtr zu setzen
Y As LongPtr
End Type


Dim Mausposition As POINTAPI
Dim hwnd As LongPtr ' hier hatte ich auch noch einen Fehler in der Declaration
hwnd = FindWindow(vbNullString, Me.Caption)
GetCursorPos Mausposition
SetWindowPos hwnd, 0, Mausposition.X, Mausposition.Y, 0, 0, _
SWP_NOACTIVATE Or SWP_NOZORDER Or SWP_FRAMECHANGED Or SWP_NOSIZE

Anzeige
AW: Userform an Mausposition öffnen
05.09.2019 17:47:18
Daniel
HI
das hochladen deiner Datei wäre nicht schlecht.
dann müsste man das nicht nachbauen.
kann ja auch sein, dass der Fehler nicht in dem hier gezeigten Code liegt, sondern an einer anderen Stelle.
Gruß Daniel
AW: Userform an Mausposition öffnen
06.09.2019 09:21:18
Julius
Hallo Daniel,
da hast du natürlich recht ;-)
Ich hab die Funktion einmal in einer Testdatei untergebracht. Da die Original recht Sensible Kundendaten beinhaltet. :)
https://www.herber.de/bbs/user/131877.xlsm
Ich denke das geht auch so. Vielen Dank
AW: Userform an Mausposition öffnen
06.09.2019 10:33:16
Daniel
HI
funktioniert bei mir fehlerfrei.
Gruß Daniel
AW: Userform an Mausposition öffnen
06.09.2019 12:40:37
Julius
Okay, verstehe ich nicht. :D
Es öffnet sich bei dir das Fenster direkt am Mauspoint?
Wieso dann nicht bei mir? Ist das ggf Excel Versions abhängig?
Dann werde ich wohl mal anfangen, das nach deinem Vorschlag umzuschreiben.
Danke dir für deine Zeit :)
Anzeige
AW: Userform an Mausposition öffnen
09.09.2019 15:43:10
Julius
Hallo Daniel,
ja du hast recht. Ich hab die Datei einmal an einem anderen Rechner Probiert und da geht es.
Ganz komisch. Ich denke irgendwo gibt es einen unterschied zwischen den ExcelVersionen.
AW: Userform an Mausposition öffnen
09.09.2019 16:04:33
Daniel
oder den Windowsversionen.
der von mir beschriebene Weg sollte davon unabhängig sein.
Außerdem würde ich auch die Mausposition verwenden, sondern nur die Buttonpostition und die Userform immer an der gleichen Stelle neben dem Button plaztieren, unabhängig davon, wo sich der Mauszeiger beim Klick befand.
Gruß Daniel

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige