Hey, ich weiß es gibt eine Funktion in der WinAPI, um "platz auf dem Desktop zu reservieren". Nun weiß niemand außer ich was ich meine, daher versuche ich es anhand eines Beispieles zu schreiben^^
Wenn man bei ICQ auf andocken klickt, dann dockt es rechts an und kein anderes Fenster überdeckt es danach, auch wenn man später auf "maximieren" klickt. Ich hoffe dass jemand von euch den Funktionsnamen weiß^^
MfG,
Xyron
Desktopplatz "reservieren"
-
- [ gelöst ]
-
Xyron -
20. Oktober 2011 um 18:35 -
Geschlossen -
Erledigt
-
-
Meinst du, dass das Fenster immer im Vordergrund bleibt? Das geht unter anderem mit
[autoit]WinSetOnTop
[/autoit], oder auch mit dem Stil $WS_EX_TOPMOST.
-
Nein, das meine ich nicht
Die anderen Fenster können das Fenster nicht überdecken, das heißt, es ist dann wie bei der Taskbar von Windows. -
Drück dich deutlicher aus. Wenn das Fenster immer im Vordergrund ist, kann es auch nicht von anderen überdeckt werden.
-
Die Fenster sollen aber auch nicht darunter sein können
Das ist bei der Taskbar so, und deswegen reicht $WS_TOPMOST nicht. Sonst hätte ich das verwendet.
-
Ich hab Windows 7, und bei mir können die Fenster unter der Taskbar rumrutschen so viel sie wollen. Ich verstehe zwar was du meinst, aber mir fällt auf Anhieb keine leicht umsetzbare Lösung ein. Alle Fenster mit WinList und WinGetPos zu überprüfen dauert vermutlich zu lange. Allerdings fände ich persönlich ein sich so verhaltendes Fenster ziemlich lästig....
-
hmm, naja, wird dann gehen. Noch eine Frage: Wie kann ich machen dass man das Fenster nicht fokussieren kann?
-
Zitat
Wie kann ich machen dass man das Fenster nicht fokussieren kann?
[autoit]
Das erscheint mir ein wenig sinnlos... Oder meinst du so etwas, wieGUISetState(@SW_DISABLE, $hWnd)
[/autoit]?
-
Hmm, ist unwichtig geworden ^^. Aber das anfangsproblem steht wieder.
Wenn ich $WS_EX_TOPMOST setze, werden fenster trotzdem dahinter gesetzt, wenn ich auf maximieren klicke, genau das würde ich gerne verhindern
Vieleich weißt du ja jetzt was ich meine -
Zitat
Vieleich weißt du ja jetzt was ich meine
Nein ^^. Ich hab kein ICQ, und dessen scheinbar sinnloses Verhalten kann ich mir auch nicht wirklich vorstellen. -
Ist nicht sinnlos
Das ist wie gesagt wie bei der Taskbar. Da werden die Fenster beim maximieren auch nicht einfach drüber gesetzt. Und genau das meine ich. Wenn ich auf maximieren klicke, dann soll das maximierte fenster nicht unter meinem sein, sondern so verschoben werden, dass es das nicht ist
-
Zitat
Wenn ich auf maximieren klicke, dann soll das maximierte fenster nicht unter meinem sein, sondern so verschoben werden, dass es das nicht ist
Überleg dir noch mal ganz genau, was du da von uns verlangst... Ein maximiertes Fenster nimmt den gesamten Desktop ein, und jetzt willst du alle Fenster so platzieren, dass sie auch Platz haben? -
- Offizieller Beitrag
WM_MAXIMIZE - Message abfangen und dann die Fenster mit WinMove auf die reduzierte Größe anpassen. Bleibt die Abwägung von Aufwand (groß) und Nutzen (??).
-
Kannst du mir zeigen wie ich die Abfangen kann? Ich habe es jetzt einiger Zeit mit_WinAPI_SetWindowsHookEx versucht, aber ich bekomme es nicht hin, dass er die fensternachrichten abfängt.
-
- Offizieller Beitrag
Die Message heißt übrigens WM_SIZING (da hatte ich mich vertan).
Das Problem ist zu Lösen mit "_WinAPI_SetWindowLong", allerdings will ich dir nicht dein Skript schreiben. Probier erst mal selbst.Na gut - hier mal ein Bsp., wie mit der Funktion gearbeitet wird. Das Anpassen für WM_SIZING kannst du ja dann selbst probieren.
Spoiler anzeigen
[autoit]#include <GuiImageList.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>Local Const $GWL_WNDPROC = -4
[/autoit] [autoit][/autoit] [autoit]$hGui = GUICreate("Test", 400, 400)
[/autoit] [autoit][/autoit] [autoit]
$hListView = _GUICtrlListView_Create($hGui, "Listview", 10, 10, 380, 380)
_GUICtrlListView_SetExtendedListViewStyle($hListView, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES)); Load images
[/autoit] [autoit][/autoit] [autoit]
$hImage = _GUIImageList_Create()
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0xFF0000, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x00FF00, 16, 16))
_GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap($hListView, 0x0000FF, 16, 16))
_GUICtrlListView_SetImageList($hListView, $hImage, 1); Add columns
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_InsertColumn($hListView, 0, "Column 1", 100)
_GUICtrlListView_InsertColumn($hListView, 1, "Column 2", 100)
_GUICtrlListView_InsertColumn($hListView, 2, "Column 3", 100); Add items
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_AddItem($hListView, "Row 1: Col 1", 0)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 2", 1)
_GUICtrlListView_AddSubItem($hListView, 0, "Row 1: Col 3", 2)
_GUICtrlListView_AddItem($hListView, "Row 2: Col 1", 1)
_GUICtrlListView_AddSubItem($hListView, 1, "Row 2: Col 2", 1)
_GUICtrlListView_AddItem($hListView, "Row 3: Col 1", 2)
GUISetState();
[/autoit] [autoit][/autoit] [autoit]
$hProc = DllCallbackRegister('_WinProc', 'ptr', 'hwnd;uint;wparam;lparam')
$hHook = _WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, DllCallbackGetPtr($hProc))GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While GUIGetMsg() <> -3
[/autoit] [autoit][/autoit] [autoit]
Sleep(10)
WEnd_WinAPI_SetWindowLong($hGui, $GWL_WNDPROC, $hHook) ; original WinProc wiederherstellen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _WinProc($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
; wenn nicht die gewünschte Msg kommt - Rückgabe an System
If $iMsg <> $WM_NOTIFY Then Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView, $tInfo
[/autoit] [autoit][/autoit] [autoit]
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $LVN_COLUMNCLICK ; A column was clicked
$tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
ConsoleWrite('MyProc: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
Return 0 ; <== Nachricht wird jetzt verworfen und kann über GUIRegisterMsg nicht verwertet werdenCase $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
ConsoleWrite("MyProc: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
" -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
EndSwitch
EndSwitch
; jetzt wird die normale WinProc aufgerufen, die man mit GuiRegisterMsg auswerten kann
Return _WinAPI_CallWindowProc($hHook, $hWnd, $iMsg, $iwParam, $ilParam)
EndFunc ;==>_WinProcFunc WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit]
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case $LVN_COLUMNCLICK ; A column was clicked <== Diese Nachricht erreicht die Funktion nicht mehr
Local $tInfo = DllStructCreate($tagNMLISTVIEW, $ilParam)
ConsoleWrite('GUIRegisterMsg: $LVN_COLUMNCLICK -->Column: ' & DllStructGetData($tInfo, "SubItem") & @CRLF)
Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
ConsoleWrite("GUIRegisterMsg: $NM_CLICK " & "-->Index: " & DllStructGetData($tInfo, "Index") & _
" -->SubItem: " & DllStructGetData($tInfo, "SubItem") & @CRLF)
EndSwitch
EndSwitch
Return 0
EndFunc ;==>WM_NOTIFY -
Ich meine es gab eine schnellere Lösung, ohne große Hooks und co.
Ich habe ein Programm gefunden, dass genau das tut was ich haben will!
DektopCoral
Ich möchte nur, dass das in meinem Script gemacht wird -
meinst Du das begrenzen des Desktop's für darstellbare Fenster?
[autoit]
Wenn ja:#include <winapi.au3>
[/autoit][autoit][/autoit][autoit]Const $SPI_SETWORKAREA = 47
[/autoit][autoit][/autoit][autoit]
Const $SPIF_SENDCHANGE = 2$tRECT = DllStructCreate('int;int;int;int')
[/autoit]
DllStructSetData($tRECT, 1, 0) ; left
DllStructSetData($tRECT, 2, 0) ; top
DllStructSetData($tRECT, 3, 1680) ; right
DllStructSetData($tRECT, 4, 1050) ; buttom
_WinAPI_SystemParametersInfo($SPI_SETWORKAREA, 0, DllStructGetPtr($tRECT), $SPIF_SENDCHANGE) -
Halleluya! Ich danke dir! Das ist GENAU das was ich gesucht habe!
Und auch ein danke an alle anderen, die hier was gepostet haben, wird mir sicherlich noch nützlich sein
Daaanke