2014-09-26 86 views
0

我正試圖在AutoHotkey中實現一種窗口停靠功能,並且無法使其級聯。在AutoHotkey中移動窗口不會觸發Windows消息

如果窗口應該停靠窗口一個的一面,我可以得到它這樣做就好了,只要窗戶一個移動,但如果窗口Ç應該堅持窗口B,我無法這樣做(可靠地)每當窗口A移動(當移動B直接移動時它移動正常)。

我有一個OnMessage處理程序設置爲WM_WINDOWPOSCHANGED,其提取從WINDOWPOS結構手柄和尺寸/位置信息的移動窗口,檢測是否有任何家屬,然後移動它們作爲合適的。問題是,移動docker似乎沒有觸發任何Windows消息,然後可以用它來移動依賴它的任何窗口。 (我設置了處理程序WM_MOVEWM_MOVING,並WM_WINDOWPOSCHANGING來看看其中有沒有被髮送,但沒有什麼是。)

由於級聯有時工作,有時沒有,我想也許該消息到下一個窗口是越來越在前一個處理程序之前發送的消息可能會完成,因此我將critical指令添加到消息處理程序中,但這沒有幫助。另外,由於其他窗口的處理程序在任何時候都不會被調用,所以我的理論似乎並不正確。

奇怪的是,如果我保留我的調試代碼(它僅僅計算一些變量並在調試窗口中向文本控件添加一行),它正確級聯的概率從0%上升到〜75% 。評論它的部分影響的機會,使其下降到約50%。因此,我認爲這可能是一個計時問題,所以我嘗試添加一個Sleep命令,並設置不同的值以查看它是否可以強制級聯工作100%,但是這並不是。

有誰知道什麼可能是錯的,以及如何解決它? (它可能會變成是一些簡單的像處理錯誤消息或返回錯誤的值。)

+0

你試過[WinEventHook](http://www.autohotkey.com/board/topic/32662-tool-wineventhook-messages/)嗎?您要查找的事件是「EVENT_SYSTEM_MOVESIZESTART」和「EVENT_SYSTEM_MOVESIZEEND」。 – MCL 2014-09-26 21:52:43

+0

看起來像一個鉤子會過度殺傷,但我目前看到的例子似乎更喜歡它們。我會繼續研究這些例子,並希望能夠使用一個簡單的消息處理程序來嘗試確定我做錯了什麼。 – Synetech 2014-09-26 22:23:47

+0

爲什麼它會過度殺傷?您可以在函數'SetWinEventHook()'中特定地鉤住某些進程和事件值範圍。即使在鉤住每個窗口和事件時,腳本基本上也不會消耗資源。用法也非常簡單,只需在第一篇文章中使用該腳本並刪除所有GUI內容即可。函數'HookProc()'處理事件。 – MCL 2014-09-27 10:14:36

回答

0

我用Dock.ahk在過去和它做了出色的工作,沒有任何滯後:http://www.autohotkey.com/board/topic/17850-module-dock-10-%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0%C2%A0-testing-20-b3/
我想我做了一些像你想做的事情,在過去有了這個庫,但我不確定。

+0

謝謝,但即使這仍然可用,我寧願避免一個臃腫,功能豐富的第三方庫,尤其是因爲這隻會解決碼頭特定的問題,而不是這個潛在的問題,碼頭相關的窗口移動問題。 – Synetech 2014-09-26 22:13:03

+0

您仍然可以通過一些googleing找到lib。我更想着你可以使用這個庫來找出你正在尋找什麼事件等等。編輯:這可能是它,不知道它是否是最新版本:https://github.com/camerb/AHKs/blob /master/thirdParty/Dock.ahk – Forivin 2014-09-26 22:16:58

+0

我目前正在通過該線程查看是否可以找到有關他們如何做的一些提示,但很多示例不起作用(它們可能與Vista +不兼容;我將在本週末在XP中測試)。到目前爲止,他們似乎更喜歡windows掛鉤消息處理程序。 – Synetech 2014-09-26 22:22:44

相關問題