Thắc mắc về kỹ thuật Hook (SubClass) (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

VMH0307

Thành viên tiêu biểu
Tham gia
5/8/11
Bài viết
766
Được thích
609
Kính gửi: mọi người!
Em sử dụng kỹ thuật SubClass để Hook thông điệp từ Window.
Em làm 1 ví dụ với hook thông điệp WM_MOUSEWHEEL của form theo đính kèm.
Hiện em đang gặp tình huống như sau:
- Nếu em tiến hành Click, DClick, Wheel..(thao tác chuột) tại Client Window (vùng không bao gồm tiêu đề) của Form thì mọi thứ diễn ra bình thường.
- Nếu em thao tác chuột lên thanh tiêu đề thì cửa sổ Form (kể cả Excel) sẽ bị "đơ", nếu tiến hành mở 1 cửa sổ khác (ví dụ 1 cửa sổ Folder) rồi quay trở lại Activate cửa sổ Excel này thì hết "đơ". Với hiện tượng này, em có cảm giác thông điệp chỉ được sử lý khi cửa sổ Excel được "kích hoạt" lại.
Em đã thử ở máy tính cơ quan hoặc ở nhà đều bị như vậy.
Mong nhận được sử giải đáp của mọi người.
 

File đính kèm

Kính gửi: mọi người!
Em sử dụng kỹ thuật SubClass để Hook thông điệp từ Window.
Em làm 1 ví dụ với hook thông điệp WM_MOUSEWHEEL của form theo đính kèm.
Hiện em đang gặp tình huống như sau:
- Nếu em tiến hành Click, DClick, Wheel..(thao tác chuột) tại Client Window (vùng không bao gồm tiêu đề) của Form thì mọi thứ diễn ra bình thường.
- Nếu em thao tác chuột lên thanh tiêu đề thì cửa sổ Form (kể cả Excel) sẽ bị "đơ", nếu tiến hành mở 1 cửa sổ khác (ví dụ 1 cửa sổ Folder) rồi quay trở lại Activate cửa sổ Excel này thì hết "đơ". Với hiện tượng này, em có cảm giác thông điệp chỉ được sử lý khi cửa sổ Excel được "kích hoạt" lại.
Em đã thử ở máy tính cơ quan hoặc ở nhà đều bị như vậy.
Mong nhận được sử giải đáp của mọi người.

Bạn thay cho UserForm thuộc tính ShowModal = TRUE hoặc dùng code UserForm1.Show TRUE
 
Upvote 0
Bạn thay cho UserForm thuộc tính ShowModal = TRUE hoặc dùng code UserForm1.Show TRUE
Em cám ơn!
Bác Siwtom có thể giải thích tại sao lại xảy ra hiện tượng như vậy khi chúng ta chưa thiết lập thuộc tính ShowModal=true kia không ạ?
Em xin hỏi thêm 1 vấn đề nữa:
Nếu chúng ta thay hWndFrm thành handle của Workbook (tức là thay Form bằng Sheet) và gọi hàm Hook thì hiện ở máy em cũng đang xảy ra hiện tượng tương tự là "đơ" cửa sổ ("đơ" ngay khi có sự kiện chuột, phím trong cửa sổ này: có lẽ "đơ" ngay khi phát sinh thông điệp), chỉ sau khi mở 1 cửa sổ khác, rồi mở lại cửa sổ excel này thì hết đơ và thông điệp kia được xử lý (tức nếu có wheel thì lúc đó mới hiện hộp thoại, hoặc di chuyển phím sang trái, phải thì lúc đó cell trên sheet mới di chuyển...)
Điều này làm cho em nghĩ rằng chỉ khi Activate lại workbook thì các thông điệp mới được xử lý, không biết có liên quan gì đến hàm CallWindowProc không ạ?, Em đang rất thắc mắc mà chưa tìm ra được lý do?
Em xin cám ơn!
 
Upvote 0
Em cám ơn!
Bác Siwtom có thể giải thích tại sao lại xảy ra hiện tượng như vậy khi chúng ta chưa thiết lập thuộc tính ShowModal=true kia không ạ?
Em xin hỏi thêm 1 vấn đề nữa:
Nếu chúng ta thay hWndFrm thành handle của Workbook (tức là thay Form bằng Sheet) và gọi hàm Hook thì hiện ở máy em cũng đang xảy ra hiện tượng tương tự là "đơ" cửa sổ ("đơ" ngay khi có sự kiện chuột, phím trong cửa sổ này: có lẽ "đơ" ngay khi phát sinh thông điệp), chỉ sau khi mở 1 cửa sổ khác, rồi mở lại cửa sổ excel này thì hết đơ và thông điệp kia được xử lý (tức nếu có wheel thì lúc đó mới hiện hộp thoại, hoặc di chuyển phím sang trái, phải thì lúc đó cell trên sheet mới di chuyển...)
Điều này làm cho em nghĩ rằng chỉ khi Activate lại workbook thì các thông điệp mới được xử lý, không biết có liên quan gì đến hàm CallWindowProc không ạ?, Em đang rất thắc mắc mà chưa tìm ra được lý do?
Em xin cám ơn!

Thú thực là tôi cũng không rõ lắm.

Nếu tôi lập trình vd. trong Delphi thì tất cả mọi cửa sổ do tôi tự tạo ra, code do tôi viết nên tôi làm chủ được nó. Và code của tôi do systyem "chạy". Nhưng với Excel thì tôi không làm chủ được hoàn toàn. Excel có vấn đề riêng của nó (vd. bảng tính) và code của tôi là do Excel "chạy". Tôi không biết được sau "cánh gà" Excel còn làm những thao tác gì.

Nói chung subclassing là phức tạp. Tôi theo dõi thì thấy thông điệp WM_NCHITTEST được gửi "liên tục, không ngừng" tới cửa sổ nên tạo ra cảm giác "đơ" - vì code trong hàm cửa sổ được thực hiện liên tục.

Với code đính kèm bên dưới thì có thể phát hiện WM_MOUSEWHEEL nhưng không có vd. WM_MOUSEMOVE
Nói chung chỉ là mò mẫm. Không hiểu được những việc mà Excel làm sau "cánh gà", trên "nền" thì tôi chịu.

Tôi tò mò chút. Bạn định làm gì vậy? Mà bạn thử dùng hook (SetWindowsHookEx) chuột, bàn phím xem sao.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom