Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: Lỗi lạ khi sử dụng hook

  1. #1
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Mặc định Lỗi lạ khi sử dụng hook

    Nhóm em đang làm một đề tài về hook. Chúng em cài đặt một hook toàn cục để bắt các message bàn phím gửi vào một chương trình soạn thảo bất kỳ (ở đây là bắt phím F2) , nhưng không hiểu sao khi chạy chương trình lại bị một lỗi run-time rất kỳ lạ(cũng có lẽ do tụi em còn "gà" T_T). Khi soạn thảo trên chương trình SDI viết bằng MFC thì không sao, nhưng nếu mở notepad, word hay wordpad thì khi nhấn F2 nó báo lỗi như sau:


    Nếu ấn nút ignore thì chương trình lại chạy bình thường.

    Tụi em đã khoanh vùng được lỗi rồi, nhưng vẫn không hiểu vì sao?

    Visual C++ Code:
    1.  
    2. EXPORT LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
    3. {
    4.     MSG*  p = (MSG*)lParam;
    5.  
    6.     if ( (nCode >= 0) && (wParam == PM_REMOVE) )
    7.     {
    8.         if (p->message == WM_KEYDOWN)
    9.         {
    10.             CWnd *pWnd;
    11.             H = p->hwnd;
    12.             pWnd = CWnd::FromHandle(H);
    13.            
    14.             if (p->wParam == VK_F2)
    15.             {
    16.                 if (! pParentWnd)
    17.                     pParentWnd = pWnd;
    18.                 CPoint point = pWnd->GetCaretPos();
    19.                 hEdit = pWnd->m_hWnd;
    20.                            
    21.                 if (!bShow)
    22.                 {
    23.                     if (bFirst)
    24.                     {
    25.  
    26.                         // Đoạn code báo lỗi!!!
    27.                         lb.Create(WS_BORDER,
    28.                             CRect(point.x + 20, point.y+20, point.x+200, point.y+200), pWnd, ID_INTELLISTBOX);
    29.                         bFirst = FALSE;
    30.                         lb.LoadLibrary(_T("MyLib.txt"));
    31.                     }
    32.                     lb.MoveWindow(point.x + 20, point.y + 20, 200, 200, 1);
    33.                     lb.ShowWindow(SW_SHOW);
    34.                     lb.SetFocus();
    35.                     bShow = TRUE;
    36.                 }
    37. //...................................................
    38. //...................................................
    39. //...................................................
    40. }

    Chúng em rất mong được các anh chị chỉ giúp.
    Đã được chỉnh sửa lần cuối bởi blackpawn : 14-05-2008 lúc 02:57 PM. Lý do: sửa lại code cho chính xác

  2. #2
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Hix, sao không ai trả lời em hết vậy?
    Em suy nghĩ mấy ngày nay mà không ra... Có khi nào do các chương trình của Windows không cho phép tạo cửa sổ con không ạ? T_T

  3. #3
    Ngày gia nhập
    07 2007
    Nơi ở
    Hồ Chí Minh
    Bài viết
    66

    Mục tiêu là bắt lấy f2, thì đạt dc rồi đó. Vì bạn nói là tới khúc đó mới báo lỗi.
    Còn đoạn đó thì mình ko hiểu lắm.
    Bạn hãy giải thích 1 số biến trong đó, và việc bạn cần làm khi f2 phát sinh.
    Thèm khát con gái !!
    ......................

  4. #4
    Ngày gia nhập
    12 2007
    Bài viết
    28

    Đoạn code đó có nhiệm vụ: khi mình nhấn F2 thì nó sẽ tạo ra một listbox lb ở ngay vị trí con trỏ hiện hành (listbox chứa một số chuỗi được load lên từ file MyLib.txt). Kiểu cũng hơi giống cơ chế nhắc từ khóa khi mình soạn thảo trên VS2005, nhưng thô sơ hơn nhiều.

    Còn biến bFirst chỉ là một biến cờ thôi, để chương trình của mình chỉ tạo đúng một listbox.(nếu bFirst = TRUE thì chưa có listbox nào được tạo ra)

    Vì khi người dùng không cần nữa thì (theo bài em) Listbox lb chỉ ẩn đi chứ không hủy, nên cần có biến bShow để xét xem khi nào cần hiện ListBox ra. Nếu bShow = TRUE rồi thì Listbox lb đang thể hiện ra, nên mình không cần thực thi đoạn code đó nữa.

  5. #5
    Ngày gia nhập
    05 2008
    Bài viết
    1

    Hix, trên mạng có một diễn đàn bổ ích như vậy mà bây giờ em mới biết. Bạn blackpawn giới thiệu em tham gia cộng đồng C Việt đó. Đây là bài viết đầu tiên của em trên diễn đàn này. Hồi hộp quá!
    Em xin được mô tả kỹ hơn đoạn code ở trên như sau:

    CWnd *pWnd ---> đây chính là con trỏ, trỏ tới đối tượng của lớp CWnd có Handle là p->hwnd (với p->hwnd chính là Handle của cửa sổ ứng dụng đang soạn thảo - chẳng hạn Notepad, Wordpad). Bằng cách sử dụng phương thức static CWnd* CWnd::FromHandle(HWND hWnd), ta thực hiện điều đó một cách dễ dàng.

    CListBox lb ---> đây chính là ListBox mà mình muốn nó hiện trên ngay dưới con trỏ mà mình đang soạn thảo để nhắc những từ khóa mà mình hay xài (giống như cái ListBox trong môi trường lập trình .NET mà chúng ta hay xài). Để tạo được ListBox này, ta sử dụng hàm BOOL CListBox::Create(... các thuộc tính...) để tạo ListBox này. Muốn hiện nó lên trên trình soạn thảo, chúng ta sử dụng hàm CListBox::ShowWindow(UINT nCmd) để ẩn, hiện ListBox này.

    Qua việc debug lỗi, em đã xác định được lỗi xuất hiện sau khi gọi hàm lb.Create(......) (không dám chắc là do hàm này gây ra, cũng có thể tham số truyền vào có vấn đề nên gây ra lỗi).

Các đề tài tương tự

  1. Mouse hook system-wide lại chạy như local hook ???
    Gửi bởi nguoixanh trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 1
    Bài viết cuối: 12-11-2013, 04:02 PM
  2. Mouse hook system-wide lại chạy như local hook ???
    Gửi bởi nguoixanh trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 1
    Bài viết cuối: 12-11-2013, 03:01 PM
  3. Hook keyboard và mouse hook trong c# không cần code
    Gửi bởi tienlbhoc trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 7
    Bài viết cuối: 23-06-2013, 01:27 PM
  4. [Kernel Driver] ShaDow SSDT Hook Có Phải là Hook đồ Họa
    Gửi bởi chàng trai dễ thương trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 0
    Bài viết cuối: 11-10-2009, 07:48 AM
  5. chỉ dẫn phương pháp Hook APi bằng inline hook
    Gửi bởi trần trân trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 3
    Bài viết cuối: 22-06-2009, 10:15 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn