我正試圖在AutoHotkey中實現一種窗口停靠功能,並且無法使其級聯。在AutoHotkey中移動窗口不會觸發Windows消息
如果窗口乙應該停靠窗口一個的一面,我可以得到它這樣做就好了,只要窗戶一個移動,但如果窗口Ç應該堅持窗口B,我無法這樣做(可靠地)每當窗口A移動(當移動B直接移動時它移動正常)。
我有一個OnMessage
處理程序設置爲WM_WINDOWPOSCHANGED
,其提取從WINDOWPOS
結構手柄和尺寸/位置信息的移動窗口,檢測是否有任何家屬,然後移動它們作爲合適的。問題是,移動docker似乎沒有觸發任何Windows消息,然後可以用它來移動依賴它的任何窗口。 (我設置了處理程序WM_MOVE
,WM_MOVING
,並WM_WINDOWPOSCHANGING
來看看其中有沒有被髮送,但沒有什麼是。)
由於級聯有時工作,有時沒有,我想也許該消息到下一個窗口是越來越在前一個處理程序之前發送的消息可能會完成,因此我將critical
指令添加到消息處理程序中,但這沒有幫助。另外,由於其他窗口的處理程序在任何時候都不會被調用,所以我的理論似乎並不正確。
奇怪的是,如果我保留我的調試代碼(它僅僅計算一些變量並在調試窗口中向文本控件添加一行),它正確級聯的概率從0%上升到〜75% 。評論它的部分影響的機會,使其下降到約50%。因此,我認爲這可能是一個計時問題,所以我嘗試添加一個Sleep
命令,並設置不同的值以查看它是否可以強制級聯工作100%,但是這並不是。
有誰知道什麼可能是錯的,以及如何解決它? (它可能會變成是一些簡單的像處理錯誤消息或返回錯誤的值。)
你試過[WinEventHook](http://www.autohotkey.com/board/topic/32662-tool-wineventhook-messages/)嗎?您要查找的事件是「EVENT_SYSTEM_MOVESIZESTART」和「EVENT_SYSTEM_MOVESIZEEND」。 – MCL 2014-09-26 21:52:43
看起來像一個鉤子會過度殺傷,但我目前看到的例子似乎更喜歡它們。我會繼續研究這些例子,並希望能夠使用一個簡單的消息處理程序來嘗試確定我做錯了什麼。 – Synetech 2014-09-26 22:23:47
爲什麼它會過度殺傷?您可以在函數'SetWinEventHook()'中特定地鉤住某些進程和事件值範圍。即使在鉤住每個窗口和事件時,腳本基本上也不會消耗資源。用法也非常簡單,只需在第一篇文章中使用該腳本並刪除所有GUI內容即可。函數'HookProc()'處理事件。 – MCL 2014-09-27 10:14:36