- 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 ?
Điều hành viên: tungblt, vuathongtin
-
- Thành viên ưu tú
- Bài viết: 663
- Ngày tham gia: T.Năm 03/04/2008 7:46 am
- Has thanked: 13 time
- Been thanked: 2 time
Cách gỡ rối WndProc như thế nào ?
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.
-
- Thành viên ưu tú
- Bài viết: 663
- Ngày tham gia: T.Năm 03/04/2008 7:46 am
- Has thanked: 13 time
- Been thanked: 2 time
Re: Cách gỡ rối WndProc như thế nào ?
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);
}
}
-
- Thành viên ưu tú
- Bài viết: 663
- Ngày tham gia: T.Năm 03/04/2008 7:46 am
- Has thanked: 13 time
- Been thanked: 2 time
Re: Cách gỡ rối WndProc như thế nào ?
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 ?
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 ?
ở dòng thứ 9 đó Control child = ctl.GetChildAtPoint(ctl_coords, GetChildAtPointSkip.Invisible);
-
- Thành viên ưu tú
- Bài viết: 663
- Ngày tham gia: T.Năm 03/04/2008 7:46 am
- Has thanked: 13 time
- Been thanked: 2 time
Re: Cách gỡ rối WndProc như thế nào ?
Mình tạo một form kéo thả TabControl vào form và kéo thả listView1 vào TabPage1, nếu có bao nhiêu listView động thì có bấy nhiêu TabPage động.
kết quả khi chạy, không lấy được tên đối tượng listView, chỉ khi click chọn item của listview thì xuất child.Name: tabControl1
Mã: Chọn hết
protected override void WndProc(ref Message m)
{
Debug.Print("out if: " + m.Msg + "; m.HWnd: " + m.HWnd);
const UInt32 WM_MOUSEACTIVATE = 0x0021;
if (m.Msg == WM_MOUSEACTIVATE)
{
Debug.Print("in WM_MOUSEACTIVATE: " + m.Msg + "; m.HWnd: " + m.HWnd);
Point screen_coords = Cursor.Position;
Control ctl = this;
Point ctl_coords = ctl.PointToClient(screen_coords);
Control child = ctl.GetChildAtPoint(ctl_coords, GetChildAtPointSkip.Invisible);
if (child != null)
{
Console.WriteLine("child.Name: " + child.Name);
}
}
base.WndProc(ref m);
}
kết quả khi chạy, không lấy được tên đối tượng listView, chỉ khi click chọn item của listview thì xuất child.Name: tabControl1
Mã: Chọn hết
out if: 792; m.HWnd: 461510
out if: 14; m.HWnd: 461510
out if: 13; m.HWnd: 461510
out if: 14; m.HWnd: 461510
out if: 13; m.HWnd: 461510
child.Name: tabControl1
out if: 528; m.HWnd: 461510
out if: 33; m.HWnd: 461510
in WM_MOUSEACTIVATE: 33; m.HWnd: 461510
out if: 20; m.HWnd: 461510
out if: 14; m.HWnd: 461510
out if: 13; m.HWnd: 461510
out if: 792; m.HWnd: 461510
Re: Cách gỡ rối WndProc như thế nào ?
Vậy tại sao không dùng sự kiện MouseEnter cho nó dể hơn không?
Ví dụ như trong form có TabControl với mấy cái TabPage và có một button
thì viết code như sau để add ListView vào cái TabPage hiện tại
Ví dụ như trong form có TabControl với mấy cái TabPage và có một button
thì viết code như sau để add ListView vào cái TabPage hiện tại
-
- Thành viên ưu tú
- Bài viết: 663
- Ngày tham gia: T.Năm 03/04/2008 7:46 am
- Has thanked: 13 time
- Been thanked: 2 time
Re: Cách gỡ rối WndProc như thế nào ?
vì sau khi Form1_load(...) xong là hàm protected override void WndProc(ref Message m) sẽ chạy nên mình muốn bắt các sự kiên của hàm này liên quan đến listView, trong khi đó mình chưa sử dụng đến biến cố chuột hay bàn phím,...
Re: Cách gỡ rối WndProc như thế nào ?
Nếu muốn dùng WndProc để bắt các sự kiện cũa ListView không thì có thể tạo một control mới thừa kế từ ListView rồi override WndProc trong class đó.
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. và 6 khách