Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: klaussp am 25.03.07 - 14:12:25

Titel: API - ist Notes minimiert?
Beitrag von: klaussp am 25.03.07 - 14:12:25
Hallo Zusammen,

ich bin nach wie vor auf der Suche nach einer Funktion, mit der man prüfen kann ob Notes gerade minimiert ausgeführt wird. Das muss doch über die API zu machen sein, ich weis allerdings nicht wie ich das ganze richtig anstelle.

Mein Ansatz wäre die Funktion "FindWindow"
Code
Declare Function FindWindow Lib "user32" Alias"FindWindowA" (Byval lpClassName As String, Byval lpWindowName As String) As Long

Aber wie finde ich nun heraus ob Notes minimiert ist?

Grüße an die API-Experten, Klaus
Titel: Re: API - ist Notes minimiert?
Beitrag von: eknori am 25.03.07 - 14:25:56
Willst du nur wissen, ob die Anwendung minimiert ist, oder willst du dann mit deinem Wissen was anstellen ?

gucke dir mal http://www.vbarchiv.net/vbapi/ShowWindow.php an. Damit kannst du das machen, was du möchtest
Titel: Re: API - ist Notes minimiert?
Beitrag von: klaussp am 25.03.07 - 14:42:43
Hallo eknori,

Danke für den Tip. Ich muss nur wissen ob Notes gerade minimiert ist, damit ich bestimmte Befehle nicht ausführe die dann auf einen Fehler laufen (ws.reloadwindow).

Wie spreche ich die Funktion in Notes so an, damit ich einen brauchbaren Wert bekomme? 'Me' scheint es in Notes nicht zu geben?

Code
    ShowWindow Me.hwnd , SW_HIDE 

Vielen Dank für Deine Hilfe, Grüße Klaus
Titel: Re: API - ist Notes minimiert?
Beitrag von: eknori am 25.03.07 - 15:27:32
hmm, geht noch einfacher mit http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/iswindowvisible.asp

oder auch mit http://www.answers.com/topic/iswindowenabled
Titel: Re: API - ist Notes minimiert?
Beitrag von: klaussp am 25.03.07 - 20:50:13
hmm....


Code
OPTIONS:
Declare Function IsWindowEnabled Lib "user32" Alias "IsWindowEnabled" ( Byval hwnd As Long ) As Long
'END OPTIONS

Sub test
	On errror Goto errorhandler	
	
	Dim wasenabled As Long  'receives enabled/disabled status of Command1
	Dim retval As Long  ' return value
	
    ' Determine if the window Command1 is currently enabled or not.
	wasenabled = IsWindowEnabled(Command1.hwnd)
	Msgbox Cstr(wasenabled)
	Exit Sub
	
errorhandler:
	Msgbox " "  + Error$ + " !!   Zeile: " + Str(Erl)
	Exit Sub
End Sub

Wie weise ich meiner aktuellen Lotus Notes Anwendung zu Command1 zu???
Das hier läuft immer hinaus auf "Variant does not contain an Object"

Grüße Klaus
Titel: Re: API - ist Notes minimiert?
Beitrag von: eknori am 26.03.07 - 06:26:24
Command1.hwnd ist die Visaul Basic Schreibweise zur Ermittlung des Window Handle der Form Command1.

Das funktioniert in Notes natürlich nicht so.

Da du dich vermutlich auch mit dem Cursor nicht in dem Fenster befindest, fällt also der einfache Weg über die API GetWindowFromPoint flach.

Du musst dich daher durch die Liste der Fenster durchfragen und nach deinem "Notes" Fenster suchen. Dann kommst du über GetWindow an das handle deiner Notes Anwendung

http://www.activevb.de/rubriken/apikatalog/deklarationen/getwindow.html

Titel: Re: API - ist Notes minimiert?
Beitrag von: klaussp am 26.03.07 - 10:54:30
Danke eknori,

leider liefert mir die Funktion "isWindowEnabled" immer True zurück, auch wenn das Fenster minimiert ist. Hast Du vielleicht noch eine andere Idee?

Hier der Code, damit es etwas klarer wird!

Declarations:
Code
Declare Function GetWindow Lib "user32" ( Byval hWnd As Long, Byval wCmd As Long) As Long
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (Byval hwnd As Long, Byval lpString As String, Byval cch As Long) As Long
Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Declare Function IsWindowEnabled Lib "user32" Alias "IsWindowEnabled" ( Byval hwnd As Long ) As Long
Declare Function IsWindowVisible Lib "user32" Alias "IsWindowVisible" ( Byval hwnd As Long ) As Long

Const GW_HWNDNEXT = 2


und die Funktion:
Code
'**************************************************************************
'* Suche nach einem übergebenen Teilstring in der Liste der Fenster
'* Prüfen ob das Fenster gerade aktiv ausgeführt wird
'**************************************************************************

Function FindWindowLike(Teilstring As String) As Long
	Dim hWnd As Long
	Dim strCurrentWindowText As String
	Dim r As Integer
	Dim ret As Boolean
	
	hWnd = GetForegroundWindow
	
	'solange durch die Fensterliste loopen bis Fenster gefunden wird	
	Do Until hWnd = 0
		strCurrentWindowText = Space$(255)
		r = GetWindowText(hWnd, strCurrentWindowText, 255)
		strCurrentWindowText = Left$(strCurrentWindowText, r)
		If Instr(1, Lcase(strCurrentWindowText), Lcase(Teilstring)) <> 0 Then Goto Found
		hWnd = GetWindow(hWnd, GW_HWNDNEXT)
	Loop
	Exit Function
	
Found:	'Teilstring wurde gefunden
	FindWindowLike = hWnd
	
'Prüfen ob das gefundene Fenster auch aktiv ausgeführt wird
	ret = 	iswindowenabled (hWnd)
	ret1 = iswindowvisible(hWnd)
	
	Dim text As String
	text = Cstr(Now) & " Ergebnis, Fensterhandle =  " & Cstr(strCurrentWindowText) & Cstr(findwindowlike) & " Enabled = " & Cstr(ret) & Cstr(ret1)
End Function

iswindowvisible liefert True
iswindowenabled liefert ebenfalls True
Das Fenster ist aber zum Testzeitpunkt definitiv minimiert, und es wird das richtige Fenster ermittelt (strCurrentWindowText).

Noch ne Idee?

Grüße, Klaus
Titel: Re: API - ist Notes minimiert?
Beitrag von: klaussp am 26.03.07 - 15:50:30
Habs gefunden - die passenden Funktion ist 'IsIconic'. Diese liefert für ein gegebenes Fenster einen Boolean Wert ob das Fenster minimiert (=True) bzw. geöffnet (=False) ist.

Declarations:
Code
Declare Function GetWindow Lib "user32" ( Byval hWnd As Long, Byval wCmd As Long) As Long
Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (Byval hwnd As Long, Byval lpString As String, Byval cch As Long) As Long
Declare Function GetForegroundWindow Lib "user32.dll" () As Long
Declare Function IsIconic Lib "user32" (Byval hwnd As Long) As Boolean

Const GW_HWNDNEXT = 2

Funktion
Code
'******************************************************************************
'* Suche nach einem übergebenen Teilstring in der Liste der Fenster
'* Prüfen ob das Fenster gerade aktiv ausgeführt wird oder minimiert ist
'* Rückgabe True = minimiert ; False = nicht minimiert
'******************************************************************************
Function PruefeMinimiert(Teilstring As String) As Boolean
	Dim hWnd As Long
	Dim strCurrentWindowText As String
	Dim r As Integer
	
	hWnd = GetForegroundWindow
	
	'solange durch die Fensterliste loopen bis Fenster gefunden wird	
	Do Until hWnd = 0
		strCurrentWindowText = Space$(255)
		r = GetWindowText(hWnd, strCurrentWindowText, 255)
		strCurrentWindowText = Left$(strCurrentWindowText, r)
		If Instr(1, Lcase(strCurrentWindowText), Lcase(Teilstring)) <> 0 Then Goto Found
		hWnd = GetWindow(hWnd, GW_HWNDNEXT)
	Loop
	Exit Function
	
Found:	'Teilstring (=Fenster) wurde gefunden
'Prüfen ob das gefundene Fenster auch aktiv ausgeführt wird (Boolean)
	PruefeMinimiert = IsIconic(hWnd) 
	Exit Function
	
errhandler:	
	Print " "  + Error$ + " !!   Zeile: " + Str(Erl)
	Exit Function
End Function

Vielleicht kanns ja noch jemand gebrauchen!

Grüße, Klaus