VBOffice

Fremden Prozess blockieren

Mit diesem Code können Sie verhindern, dass der Anwender in einem anderen Programm weiterarbeitet, während Ihr Programm noch auf eine Dateneingabe wartet.

Zuletzt geändert: 05.02.2006 | Aufrufe: 89.072  | #22
◀ Vorheriges Beispiel Nächstes Beispiel ▶
OLKeeper OLKeeper
Der OLKeeper verhindert zuverlässig, dass Sie Microsoft Outlook unbeabsichtigt schließen und so etwa wichtige Emails verpassen würden.

Häufig hat ein Outlook-Programierer die Aufgabe, während der Bearbeitung einer E-Mail ein eigenes Formular anzuzeigen, um z.B. weitere Daten vom Anwender abzufragen

Wenn der Anwender Microsoft Word als Maileditor nutzt, dann gibt es ein Problem: Ihr Code läuft im Prozess Outlooks, während der Maileditor im Prozess Words läuft. Das bedeutet z.B., dass Sie Ihr Formular nicht modal zum Mailfenster anzeigen können; ohne Tricks gelingt es nicht einmal, das Formular in den Vordergrund zu bringen oder ihm gar den Fokus zu geben.

Dr. Jürgen Thümmler stellt die DLL dsmodal kostenlos zur Verfügung: Damit können Sie ganz einfach ein beliebiges Fenster modal zu einem Fenster eines anderen Prozesses oder systemmodal anzeigen.

Das folgende Beispiel zeigt, wie Sie die nötigen Fensterhandles ermitteln und dsmodal verwenden. Bitte kopieren Sie die dsmodal.dll in das Systemverzeichnis (..winntsystem32), damit sie gefunden wird.

Im Beispiel wird ein VB-Formular verwendet; weisen Sie vorm Laden des Formulars bitte der Eigenschaft ParentWindowCaption die Caption-Eigenschaft des Mailfensters zu (Inspector.Caption).

Mit ein paar kleinen Änderungen können Sie das Beispiel auch in VBA verwenden. Da es dort kein Form_Load-Ereignis gibt, könnten Sie den Code z.B. einmalig im Activate-Ereignis aufrufen. Außerdem gibt es im VBA-UserForm keine Eigenschaft für das Fensterhandle. Mit der Caption-Eigenschaft und der gezeigten FindChildWindowText-Funktion ist dessen Ermittlung aber kein Problem.


tip  So fügen Sie Makros in Outlook ein
Private Declare Function MakeModal& Lib "dsmodal" _
  (ByVal AppHwnd&, ByVal hwndDest&, Optional ByVal Beep& = 0)

Public ParentWindowCaption As String

Private Sub Form_Load()
  Dim lParent As Long
  Dim lMe As Long

  lParent = FindChildWindowText(GetDesktopWindow, ParentWindowCaption)

  ' VB Forms:
  lMe = Me.hwnd

  Call MakeModal(lMe, lParent, 1)
End Sub

Private Sub Form_Unload(Cancel As Integer)
  Call MakeModal(0, 0, 0)
End Sub
ReplyAll ReplyAll
Mit diesem Addin für Outlook erhalten Sie in verschiedenen Situationen eine Warnung, bevor Sie auf eine Email versehentlich allen anderen Empfängern antworten.
email  Senden Sie eine Nachricht