• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

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

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Điều hành viên: tungblt, vuathongtin

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 631
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 13 time
Been thanked: 1 time

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

Gửi bàigửi bởi dong » T.Hai 22/01/2018 9:24 am

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.



FlyingFox
Guru
Guru
Bài viết: 786
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 313 time

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

Gửi bàigửi bởi FlyingFox » T.Hai 22/01/2018 6:12 pm


dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 631
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 13 time
Been thanked: 1 time

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

Gửi bàigửi bởi dong » T.Năm 25/01/2018 3:05 pm

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);
            }
  }

FlyingFox
Guru
Guru
Bài viết: 786
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 313 time

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

Gửi bàigửi bởi FlyingFox » T.Sáu 26/01/2018 3:44 pm

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. }

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 631
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 13 time
Been thanked: 1 time

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

Gửi bàigửi bởi dong » CN 28/01/2018 5:00 pm

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.

FlyingFox
Guru
Guru
Bài viết: 786
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 313 time

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

Gửi bàigửi bởi FlyingFox » T.Hai 29/01/2018 10:52 am

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)

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 631
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 13 time
Been thanked: 1 time

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

Gửi bàigửi bởi dong » T.Năm 01/02/2018 2:06 pm

nếu viết kiểu này thì không có liên quan gì sử dụng đến biến m.Msg

FlyingFox
Guru
Guru
Bài viết: 786
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 313 time

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

Gửi bàigửi bởi FlyingFox » T.Sáu 02/02/2018 6:00 am

Vẩn phải viết như cách đầu tiên, chỉ sữa lại dòng IF đó thôi.

dong
Thành viên ưu tú
Thành viên ưu tú
Bài viết: 631
Ngày tham gia: T.Năm 03/04/2008 7:46 am
Has thanked: 13 time
Been thanked: 1 time

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

Gửi bàigửi bởi dong » T.Hai 05/02/2018 2:41 pm

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 ?

FlyingFox
Guru
Guru
Bài viết: 786
Ngày tham gia: T.Tư 20/04/2011 9:56 am
Been thanked: 313 time

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

Gửi bàigửi bởi FlyingFox » T.Hai 12/02/2018 2:48 pm

ở dòng thứ 9 đó Control child = ctl.GetChildAtPoint(ctl_coords, GetChildAtPointSkip.Invisible);


Quay về “Visual Basic .NET và C# (VB.NET & C#)”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.7 khách