Access 2007: Priorität der Anwendung

Hallo,

ich hatte mal im Netz eine sehr nützliche Funktion gefunden, mit der ich die Access-Fenstergröße einstellen und das Verändern der Größe des Fensters verhindern kann.

Die Funktion(en) funktionieren genau nach meiner Vorstellung, jedoch mit der Einschränkung, dass sich Access immer in den Vordergrund drängelt.
Sobald man ein anderes Windows-Programm öffnet, wird das gerade geöffnete Programm in den Hintergrund und im Anschluss sofort wieder das Access-Fenster in den Vordergrund gesetzt. Gleiches trifft zu, wenn sich Windows-Hintergrundprozesse öffnen.
Daher die Frage, ob man das verhindern kann?

Dank vorab
Gruß
Ronny

Public Declare Function IsIconic Lib „user32“ (ByVal hwnd As Long) As Long 'Minimieren verhindern
'Folgenden Code im entsprechenden Formular einfügen:
'Private Sub Form_Resize()
'If IsIconic(Me.hwnd) = 1 Then
’ DoCmd.RunCommand acCmdAppMinimize
'Else
’ DoCmd.RunCommand acCmdAppRestore
'End If
'End Sub

'Acces-Fenstergröße
Declare Function apiGetActiveWindow Lib „user32“ Alias „GetActiveWindow“ () As Long
Declare Function apiGetParent Lib „user32“ Alias „GetParent“ (ByVal hwnd As Long) As Long
Declare Function apiMoveWindow Lib „user32“ Alias „MoveWindow“ _
(ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal _
nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) _
As Long

Function GetAccesshWnd()
Dim hwnd As Long
Dim hWndAccess As Long

’ Get the handle to the currently active window.
hwnd = apiGetActiveWindow()
hWndAccess = hwnd

’ Find the top window (which has no parent window).
While hwnd 0
hWndAccess = hwnd
hwnd = apiGetParent(hwnd)
Wend

GetAccesshWnd = hWndAccess
End Function

Function AccessMoveSize(iX As Integer, iY As Integer, iWidth As _
Integer, iHeight As Integer)
apiMoveWindow GetAccesshWnd(), iX, iY, iWidth, iHeight, True
End Function

Function autoexec()
Dim a
a = AccessMoveSize(0, 0, 1024, 750)

End Function

Moin Moin,

Die Funktion(en) funktionieren genau nach meiner Vorstellung,
jedoch mit der Einschränkung, dass sich Access immer in den
Vordergrund drängelt.

tja, das hast du dir so ausgesucht :smile:

Daher die Frage, ob man das verhindern kann?

schau dir mal diese Schleife an:

’ Find the top window (which has no parent window).
While hwnd 0
hWndAccess = hwnd
hwnd = apiGetParent(hwnd)
Wend

Grüße aus Rostock
Wolfgang
(Netwolf)

Hallo,

ich verstehe Deine Antwort nicht:

’ Find the top window (which has no parent window).
While hwnd 0
hWndAccess = hwnd
hwnd = apiGetParent(hwnd)
Wend

Bedeutet doch, dass für Windows das aktive Access-Fenster ermittelt wird. Solange hwnd ungleich 0 ist durchläuft er die Schleife. Hat er Access gefunden weist er dem Handle hwnd die Parent-Eigenschaft zu.

Aber diese Funktion wird doch nur durchlaufen, wenn ich mittels der Min-/Max-Schaltflächen eines Access-Formulars die Routine „Form-Resize“ aktiviere, welche mittels IsIconic abfragt, welchen Wert die hwnd hat?
Was ich damit meinte ist, dass die Funktion(en) doch erst aktiviert werden, wenn Access ohnehin im Vordergrund ist.

Von daher ist mir unklar, worauf Du mich hinweisen möchtest.

Daher die Bitte eines Tipps.
Danke

Gruß aus Leipzig
Ronny

Moin Moin,

’ Find the top window (which has no parent window).

= finde das oberste Fenster, das keine weiteren „Eltern“-Fenster hat.
Fenster der Eltern->Kind Beziehungen findest du häufig bei Office–Programmen, wenn du eine Einstellung öffnest. Du kannst im „Eltern“-Fenster erst weiter arbeiten, wenn du das „Kind“-Fenster mit den Einstellungen geschlossen hast.

Bei Größenänderung bedeutet z.B. auch beim minimieren, oder von Vollbild auf Fenstergröße umschalten und wenn es nur ein Millimeter ist.

While hwnd 0

führe diese Schleife so lange aus, wie hwnd nicht 0 ist
= es gibt noch „Kind“-Fenster.

hWndAccess = hwnd

weise dem Accessfenster das aktuelle Handle zu

hwnd = apiGetParent(hwnd)
prüfe, ob es noch ein „Eltern“-Fenster gibt und weise das Handle hwnd zu. D.h. prüfe, ob es noch ein Fenster über dem Access-Fenster gibt.

Wend

Bedeutet doch, dass für Windows das aktive Access-Fenster
ermittelt wird.

nein, alle anderen Fenster werden so lange durchlaufen, bis das Access-Fenster wieder oben ist.

Solange hwnd ungleich 0 ist durchläuft er die
Schleife. Hat er Access gefunden weist er dem Handle hwnd die
Parent-Eigenschaft zu.

nein, ist das Access-Fenster ein „Eltern“-Fenster = ganz oben, wird die Schleife erst verlassen.

Aber diese Funktion wird doch nur durchlaufen, wenn ich
mittels der Min-/Max-Schaltflächen eines Access-Formulars die
Routine „Form-Resize“ aktiviere,

nicht nur, jede noch so kleine Änderung an der Größe (egal ob mit Taste, oder Mausbewegung hervorgerufen) führt zur Ausführung der Funktion. Würdest du z.B. den unteren Rand mit der Maus nach oben ziehen, würde diese Funktion einige Male durchlaufen.

welche mittels IsIconic abfragt, welchen Wert die hwnd hat?

nö, „is Icon“ sagt: gib mir mal das hwnd (Handle (=Nr) vom offenen Fenster) und ist prüfe, ob es ein minimiertes Icon, oder ein offenes Fenster ist.

Was ich damit meinte ist, dass die Funktion(en) doch erst
aktiviert werden, wenn Access ohnehin im Vordergrund ist.

nein, ein Resize kann auch von außen erfolgen, z.B. über das Betriebssystem (alle Fenster minimieren/wiederherstellen, oder nur mal den Desktop anzeigen lassen).

D.h. um Veränderungen am „Access“-Fenster vorzunehmen, muss es kurzfristig den Fokus bekommen. Das reicht aus, um eine Größenänderung festzustellen und die Funktion auszuführen.

Von daher ist mir unklar, worauf Du mich hinweisen möchtest.

Diese Funktion sorgt dafür das Access immer das oberste Fenster ist.
Wenn du das nicht möchtest, lasse die Routine weg, oder überlege dir ganz genau, wann Access immer oben sein soll und wann nicht.
Alle diese Ausnahmen musst du dann in diese Schleife einbauen.

Wenn du z.B. möchtest, dass der Taschenrechner über dem Access-Fenster liegen darf, so musst das entsprechende Fenster (also dessen Betitelung) zugelassen werden.

Hier gibt es einen Code, der z.B. alle offenen Fenstertitel auflistet, die API-Funktionen kannst du für dich übernehmen.

http://www.herber.de/forum/archiv/316to320/t319603.htm

Grüße aus Rostock
Wolfgang
(Netwolf)

1 Like

Hallo Netwolf,

vielen Dank für die Erklärungen. Mit VBA komme ich einigermaßen zurecht, beim Übergang zu den Windows-APIs mangelt es mir jedoch derzeit noch an Verständnis.

Ich schau mir die Sache unter dem angegebenen Link demnächst an, gehe jetzt aber erstmal in den Urlaub :smile:

Ich wünsche schönes Wetter und stressfreie Tage.

Grüße aus dem schwülen Leipzig
Ronny