MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Outlook (Express), sonst. Mailprogramme
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 17.02.2018, 13:41   #1
Nimrod_189
Neuer Benutzer
Neuer Benutzer
Standard OL 2010 - Userform im Mailfenster zentrieren

Hallo Leute,

ich möchte ein Userform aus einem Mailfenster öffnen und im Mailfenster zentrieren.

Leider komme ich hier überhaupt nicht zu einem Ergebnis.

Hat einer vielleicht eine Ideee?

Vielen Dank im Voraus.

Gruß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.02.2018, 13:56   #2
markusxy
MOF Meister
MOF Meister
Standard

Was hast du versucht, und wo liegt das Problem genau?
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.02.2018, 14:26   #3
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Private Sub UserForm_Activate()
Me.Top = ActiveWindow.Top + (ActiveWindow.Height / 2) - Me.Height
Me.Left = ActiveWindow.Left
End Sub


Hintergrund:

Ich habe 3 Monitore, aber egal wie ich es anstelle, die Userform-Position ist immer anders auf den Monitoren.

Ich möchte gerne, dass Mailfenster öffnen und hier im Mailfenster soll mein Userform immer zentriert im Mailfenster erscheinen.

Vielen Dank im Voraus.
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.02.2018, 14:49   #4
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Ich wollte noch sagen, ich habe alle möglichen Konstellationen von

Me.Left = ActiveWindow.Left + (ActiveWindow.width/2) usw.

versucht.
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.02.2018, 16:07   #5
markusxy
MOF Meister
MOF Meister
Standard

Interessant.
Wird das Event ausgeführt und wird dabei das Userform verschoben?
Warum verwendest du überhaupt das Event? Du könntest das ganze ja beim Öffnen direkt per Code steuern.

Grundsätzlich verwendet das Userform ja Points als Maßeinheit und Outlook Twips. Daher wirds nicht stimmen. Du müsstest also versuchen die Einheiten zu synchronisieren, wenn der Code grundsätzlich greift.
Geht es da mehr als nur um Kosmetik?
Denn der User könnte das Userform ja selbst positionieren.

LG M
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.02.2018, 16:38   #6
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Es geht im Grunde wirklich um Kosmetik, da ich das Userform in der nähe vom Mailfenster platzieren möchte.

Aber vielleicht komme ich ja mit deinem Hinweis ja schon weiter.

Sollte ich eine Lösung finden, melde ich mich dann wieder.

Gruß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 18.02.2018, 14:09   #7
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Leute,

also ich bin total gescheitert.
Ich bekomme es einfach nicht hin.

Hier noch einmal mein grundsätzliches Problem.

Es gibt 3 Monitore. OL 2010 befindet sich auf irgeneinem dieser Monitore. Jetzt soll das Mailfenster geöffnet werden und hieraus wird Userform geöffnet.

Jetzt soll sich das Userform sich mittig zum Mailfenster, dieses kann sich ja überall befinden, positionieren.

Vielleicht findet ja jemand eine Lösung.
Wäre schon echt klasse.

Griß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.02.2018, 09:02   #8
markusxy
MOF Meister
MOF Meister
Standard

@Nimrod,
ja das Problem sind die Monitore.
Die Koordinaten von den Objekten beziehen sich ja immer auf den Monitor auf dem sich das Objekt befindet.

Da kannst du nur direkt mit Windows Funktionen arbeiten.
GetWindow, GetWindowRect, MoveWindow der user32.dll wären die notwendigen Funktionen.

Kannst dich ja mal versuchen. Beispiele sind jede Menge im Web zu finden.
Ansonsten kann ich mal ein Beispiel erstellen sobald ich Zeit habe.

Hier solltest du einiges dazu finden.
LG Markus
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 19.02.2018, 17:44   #9
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Die und andere Lösungen hatte ich auch schon am Wickel.
Aller verlangen aber eine hwnd-Property, dies aber für die Userforms bzw. das ActiveWindow nicht gibt.

Wenn du es schaffst eine Lösung zu finden, wäre das echt klasse.

Gruß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 20.02.2018, 09:16   #10
markusxy
MOF Meister
MOF Meister
Standard

Hier ein Beispiel um die hwnd auszulesen.
Im Prinzip werden alle Formulare aller Anwendungen durchsucht und bei übereinstimmender Überschrift zurückgeliefert.


Code:

Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long



Sub testhwnd(Insp As Outlook.Inspector, UF As UserForm1)
    Dim hwndInspector As Long, hwndUF As Long
    
    hwndInspector = FindWindow(vbNullString, Insp.Caption)
    hwndUF = FindWindow(vbNullString, UF.Caption)
    
    
End Sub
LG Markus
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.02.2018, 18:12   #11
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Danke für den Link.

Ich werde das alles einmal in Ruhe testen.

Gruß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.03.2018, 19:02   #12
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

So Leute ich habe mir eine Klasse in VBNet erstellt, mit der ich jetzt zumindest ein VBNet-Programm immer genau in der aktuellen Anwendung zentrieren kann. Getestet habe ich das mit MS Office 2010 (Access, Word, Excel, Outlook u. OL-Mailfenster, Powerpoint) und Notepad/Notepad++.

Hier meine Klasse:

Code:

Module mdlMonitor

    'MS Office 2010 und andere Programme (Testzwecke)
    'OL_Mail (Mailfenster) hat Vorrang vor OL_Main (Outlook-Mainfenster)

    Public Enum progOffice
        Word = 0
        Excel = 1
        Access = 2
        Powerpoint = 3
        OL_Mail = 4
        OL_Main = 5
        Notepad = 6
        NotepadPlus = 7
    End Enum

    'VB.NET-Quellcode
    'Fenster auf neue Position setzen
    Private Declare Function SetWindowPos Lib "user32.dll" (
      ByVal hwnd As Int32,
      ByVal hWndInsertAfter As Int32,
      ByVal x As Int32,
      ByVal y As Int32,
      ByVal cx As Int32,
      ByVal cy As Int32,
      ByVal wFlags As Int32) As Int32
    Private Const HWND_NOTOPMOST As Int32 = -2
    Private Const SWP_SHOWWINDOW As Int32 = &H40
    'Fenster position ermitteln/auslesen
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    Private Declare Function GetWindowRect Lib "user32" Alias "GetWindowRect" (ByVal hwnd As IntPtr, ByRef lpRect As RECT) As Integer

    Public Structure RECT
        Public Left As Int32
        Public Top As Int32
        Public Right As Int32
        Public Bottom As Int32
    End Structure

    'Fenster position und größe neu setzen
    Public Sub SetFormPosition(f As Form, intX As Integer, intY As Integer, intRight As Integer, intBottom As Integer)
        'intRight-intX => Breite des Fenster (Word)
        'intBotton-intY => Höhe des Fenster (Word)
        f.Left = intX + CInt((intRight - intX) / 2) - CInt(f.Width / 2)
        f.Top = intY + CInt((intBottom - intY) / 2) - CInt(f.Height / 2)
    End Sub

    Public Function GetProgPosition(sClassName As progOffice) As RECT
        's. auch http://users.skynet.be/am044448/Programmeren/VBA/vba_class_names.htm
        Dim ProgHandle As Integer
        Dim ProgClass As String = ""

        Select Case CInt(sClassName)
            Case 0
                ProgClass = "Opusapp"
            Case 1
                ProgClass = "XLMain"
            Case 2
                ProgClass = "OMain"
            Case 3
                ProgClass = "PPTFrameClass"
            Case 4
                ProgClass = "rctrl_renwnd32"
            Case 5
                ProgClass = "rctrl_renwnd32"
            Case 6
                ProgClass = "Notepad"
            Case 7
                ProgClass = "Notepad++"

        End Select

        ProgHandle = FindWindow(ProgClass, vbNullString) 
        GetWindowRect(CType(ProgHandle, IntPtr), GetProgPosition)

    End Function

End Module
Aufgerufen wird das ganze dann wie folgt:

Im Formload-Ereignis (Achtung: VBNet):

Code:

        Dim tRect As RECT
        tRect = GetProgPosition(progOffice.Word)
        SetFormPosition(Me, tRect.Left, tRect.Top, tRect.Right, tRect.Bottom)
Ich werde daher mein bisherigen Code einfach auf VBNet portieren. Damit bin ich sogar noch flexibler als mit VBA.

Gruß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.03.2018, 19:25   #13
markusxy
MOF Meister
MOF Meister
Standard

@Gruß Nimrod_189,
und ist dir klar, dass der Code keine .net Klassen nutzt und der Code in VBA genau gleich aussehen würde?
Wo soll der Vorteil sein?
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.03.2018, 15:01   #14
Nimrod_189
Threadstarter Threadstarter
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Markusxy,

das ist mir klar, da ich ja DLL-Aufrufe verwende.
Der Vorteil für mich liegt darin, dass ich eine eigenständige EXE habe, die ich einfach warten kann. Ich muss dann nicht von Rechner zu Rechner laufen und dort die Änderungen von Hand vornehmen. Leider unterliege ich nämlich gewissen Restriktionen und da ist eine EXE erheblich leichter.

Gruß Nimrod_189
Nimrod_189 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.03.2018, 12:26   #15
markusxy
MOF Meister
MOF Meister
Standard

Zitat: von Nimrod_189 Beitrag anzeigen

Ich muss dann nicht von Rechner zu Rechner laufen

Da hast natürlich recht.
Wobei ich nicht verstehe wie da eine Exe hilft. Du brauchst ja trotzdem den VBA Code der die exe ansteuert.

Ich habe mit Add-In noch nicht Erfahrung gemacht - wäre das aber nicht eher die erste Wahl?
LG M
markusxy ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.