Trang 1 trên 1

Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Hai 22/01/2018 9:24 am
gửi bởi dong
Mình làm ví dụ nhỏ có sử dụng đến hàm protected override void WndProc(ref Message m) mình muốn gỡ rối hàm này mình thấy biến m trả về là các số nhưng mình không hiểu những con số này có liên quan đến các control như thế nào ? ví dụ trên form có 2 button, 3 listView, 4 textbox,... mình có cần cài thêm phần mềm gì để biết những con số của biến m.Msg trả về là của control nào ? hoặc bạn nào có tư liệu hướng dẫn về cách bắt lỗi và gỡ rối hàm WndProc nói trên share cho mình với.

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Hai 22/01/2018 6:12 pm
gửi bởi FlyingFox

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Năm 25/01/2018 3:05 pm
gửi bởi dong
Mình có đọc tài liệu bạn gửi nhưng mình cũng chưa thực sự hiểu chúng. Giả sử mình cần bắt thông điệp listView và trên form có 3 listView thì biến m.Msg làm sao phân biệt được listView1, listView2, listView3,... và khi chạy xuất ra thông điệp của biến m.Msg trong file đính kèm http://www.mediafire.com/file/weab5ppsb ... ndProc.doc

Mã: Chọn hết

 protected override void WndProc(ref Message m)
   {
        Debug.Print("out if: " + m.Msg);
        if (m.Msg == WM_NOFITY)
            {
                Debug.Print("in if: " + m.Msg);
            }
  }

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Sáu 26/01/2018 3:44 pm
gửi bởi FlyingFox
Có thể viết như sau cho trường hợp mouse activate
  1. protected override void WndProc(ref Message m)
  2. {
  3.     const UInt32 WM_MOUSEACTIVATE = 0x0021;
  4.     if (m.Msg == WM_MOUSEACTIVATE)
  5.     {
  6.         Point screen_coords = Cursor.Position;
  7.         Control ctl = this;
  8.         Point ctl_coords = ctl.PointToClient(screen_coords);
  9.         Control child = ctl.GetChildAtPoint(ctl_coords, GetChildAtPointSkip.Invisible);
  10.         if (child != null)
  11.         {
  12.             Console.WriteLine(child.Name);
  13.         }
  14.     }
  15.     base.WndProc(ref m);
  16. }

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: CN 28/01/2018 5:00 pm
gửi bởi dong
Theo lý thuyết bạn gửi cho mình hướng dẫn sử dụng WndPoc như bạn trình bày code ở trên nhưng thực thế tế mình thử kéo thả vào form 3 cái listView và vài cái control khác, mình chỉ muốn bắt đối tượng là listView thôi, khi chạy biến m.Msg đổ ra các con số nhưng mình không biết số nào là của đối tượng listView, mình đang bí chổ này nè bạn ơi, nếu bạn biết thì chỉ giúp mình với.

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Hai 29/01/2018 10:52 am
gửi bởi FlyingFox
Nếu chỉ muốn bắt đối tượng là ListView thì viết như thế này: if (child != null && child is ListView)

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Năm 01/02/2018 2:06 pm
gửi bởi dong
nếu viết kiểu này thì không có liên quan gì sử dụng đến biến m.Msg

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Sáu 02/02/2018 6:00 am
gửi bởi FlyingFox
Vẩn phải viết như cách đầu tiên, chỉ sữa lại dòng IF đó thôi.

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Hai 05/02/2018 2:41 pm
gửi bởi dong
Trong hàm WndProc(ref Message m) có biến m truyền vào thôi, vậy biến child khai báo như thế nào trong hàm WndProc vậy bạn ?

Re: Cách gỡ rối WndProc như thế nào ?

Đã gửi: T.Hai 12/02/2018 2:48 pm
gửi bởi FlyingFox
ở dòng thứ 9 đó Control child = ctl.GetChildAtPoint(ctl_coords, GetChildAtPointSkip.Invisible);