2009-08-25 38 views
6

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 được WM_MOVE, WM_MOVING hoặc WM_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.

Trả lời

1

Hm, tôi sẽ nghĩ rằng đã HCBT_MOVESIZE là chính xác những gì bạn muốn, cho rằng các MSDN nói này về CBT móc:

The system calls this function before activating, creating, destroying, 
minimizing, maximizing, moving, or sizing a window.

và đặc biệt:

HCBT_MOVESIZE 
    A window is about to be moved or sized.

(những dấu ngoặc kép được lấy từ http://msdn.microsoft.com/en-us/library/ms644977%28VS.85%29.aspx)

... vì vậy tôi đã nghĩ rằng bạn nhận được cuộc gọi HCBT_MOVESIZE trong thời gian. Hàm hook xử lý HCBT_MOVESIZE cũng được phép trả về một số nguyên sao cho hệ thống có thể xác định xem hoạt động được cho phép hay nên được ngăn chặn. Do đó, cho rằng móc HCBT_MOVESIZE sẽ nhận được một tùy chọn để ngăn chặn các hoạt động, tôi muốn nói nó được gọi trước khi sự kiện di chuyển xảy ra.

Bạn có thực sự chắc chắn chức năng móc được gọi là sau sự kiện di chuyển?Nếu bạn thực hiện một cuộc gọi GetWindowRect trên tay cầm cụ thể trong hàm hook của bạn, thì hàm rect trả về bằng hình chữ nhật được truyền cho hàm hook?

+0

Đ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. –

1

Móc khá nặng. Bạn chỉ muốn sử dụng chúng khi bạn hoàn toàn phải làm vậy.

Điều đó nói rằng, bạn có thể sử dụng một trong các móc cơ bản đơn giản như một cách để tham gia vào quy trình. Khi đang trong quá trình, bạn có thể phân lớp cửa sổ bạn quan tâm và xử lý các thông báo định cỡ trong lớp con của bạn chứ không phải cố gắng nắm bắt mọi thứ ở cấp độ móc.

Tùy thuộc vào những gì bạn muốn làm để đáp ứng với thay đổi kích thước, bạn có thể cần một số thông tin liên lạc giữa các quá trình.

+0

Phân lớp có vẻ là cách để đi đến đây. Tuy nhiên, Visual Studio treo tất cả các thời gian khi tôi không bước qua việc loại bỏ thực tế của subclassing. –

Các vấn đề liên quan