Tôi gặp sự cố khi nhận móc hệ thống toàn cầu hoạt động. Tôi muốn được thông báo bất cứ khi nào một cửa sổ đang di chuyển, càng sớm càng tốt, và thay đổi kích thước cửa sổ. Điều này có nghĩa là móc CBT HCBT_MOVESIZE
sẽ không cắt nó, nó chỉ xảy ra sau khi cửa sổ đã được di chuyển. Tôi muốn móc chuyển động thực tế của cửa sổ, và có thể thay đổi kích thước cửa sổ trong khi di chuyển.Chuyển động cửa sổ chặn toàn cầu
Các móc được đặt từ một DLL và hàm gọi lại nằm trong tệp DLL đó. Đây là những gì tôi đã thử.
WH_CALLWNDPROC
. Nó cảnh báo cho tôi khi một cửa sổ được di chuyển (WM_MOVING
được nhận cho các cửa sổ từ các ứng dụng khác), nhưng tôi không thể thay đổi nội dung của tin nhắn.WH_CALLWNDPROCRET
Tương tự nhưWH_CALLWNDPROC
.- Móc CBT
HCBT_MOVESIZE
. Sự kiện xảy ra muộn. WH_GETMESSAGE
. Không bao giờ nhận đượcWM_MOVE
,WM_MOVING
hoặcWM_WINDOWPOSCHANGING
. Cái móc này sẽ cho phép tôi thay đổi tin nhắn.
Cập nhật: móc sự kiện Windows dường như cho phép tôi để nắm bắt nó:
hWinEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART,
EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc,
0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
Tuy nhiên, điều này tạo ra một vấn đề khác nhau: thay đổi kích thước của cửa sổ sử dụng SetWindowPos()
không hoạt động (nó thay đổi kích thước, nhưng ngay lập tức thay đổi về kích thước trước đó), mặc dù tôi sử dụng SWP_NOSENDCHANGING
. Ý tưởng?
Cập nhật 2: Phân lớp dường như hoạt động, tuy nhiên Visual Studio gặp sự cố sau mỗi lần chạy chương trình (vì vậy có nhiều cửa sổ khác). Nó hoạt động tốt nếu tôi đặt breakpoint và đi qua "unsubclassing", nhưng không phải khi tôi để chương trình tự chạy. Ý tưởng?
Tôi có một móc CBT (nó đã có từ trước đó), và bất cứ khi nào HCBT_ACTIVATE
được gửi cho một cửa sổ mới, tôi loại bỏ bất kỳ phân lớp trước bằng cách sử dụng SetWindowLongPtr()
(điều này phải chạy trên 64-bit), và sau đó phân lớp cửa sổ mới. Nếu tôi đặt một điểm ngắt ở bất cứ nơi nào, và ngay lập tức tiếp tục phiên khi nó phá vỡ, mọi thứ hoạt động tốt. Tuy nhiên, khi tôi không có bất kỳ điểm ngắt, Visual Studio tai nạn khi chương trình thoát.
Điều gì xảy ra với 'HCBT_MOVESIZE' là người dùng có thể bắt đầu kéo cửa sổ, tiếp tục kéo cửa sổ và thông báo không đến trước khi anh để cửa sổ mở. Tuy nhiên, bạn nhận được thông báo trước khi cửa sổ được di chuyển về mặt kỹ thuật, nhưng nó vẫn khá vô dụng. –