Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 16 kết quả

Đề tài: Hook Message Click button - Menu - Trên Process Khác

  1. #1
    Ngày gia nhập
    01 2010
    Bài viết
    31

    Mặc định Hook Message Click button - Menu - Trên Process Khác

    Chào mọi người,
    Mình đang tìm hiểu làm sao để bắt được sự kiện nhấn phím hoặc nhấn vào một menu item trên một cửa sổ của một chương trình khác. Ai có tài liệu hay gợi ý gì thì cho mình biết với.
    Xin cám ơn rất nhìu

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

    - Bạn có thể tham khảo hàm SetWindowLong() .

    -> ý tưởng là Inject vào chuơng trình cần Hook rồi gọi hàm SetWindowLong().

    Thân,
    Chúc thành công.

  3. #3
    Ngày gia nhập
    01 2010
    Bài viết
    31

    Trích dẫn Nguyên bản được gửi bởi khanhduy301 Xem bài viết
    - Bạn có thể tham khảo hàm SetWindowLong() .

    -> ý tưởng là Inject vào chuơng trình cần Hook rồi gọi hàm SetWindowLong().

    Thân,
    Chúc thành công.
    Xin lỗi nhưng mình không hiểu ý bạn lắm. Mình có tham khảo MSDN thì nó ghi thế này.
    The SetWindowLong function changes an attribute of the specified window. The function also sets the 32-bit (long) value at the specified offset into the extra window memory.
    Việc này thì liên quan gì đến việc bắt sự kiện nhấn phím ???

    Mình lấy một ví dụ minh họa. Trong Notepad, khi mình nhấn vào menu "File/Exit" thì nó sẽ tắt Notepad đi và mở lên một cửa sổ Word thay vì chỉ đơn giản là tắt notepad đi.

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

    - Gọi với tham số GWL_WNDPROC để thay hàm WindowProc của nó = hàm của mình và tiên tay bắt sự kiện dùm nó .

    Thân,

  5. #5
    Ngày gia nhập
    01 2010
    Bài viết
    31

    Bạn có thể cho mình một ví dụ cụ thể nhỏ được không. Mình hiểu mà không hình dung được cách làm :(.

  6. #6
    Ngày gia nhập
    10 2007
    Bài viết
    45

    Smile Hook Message Click button - Menu - Trên Process Khác

    Trích dẫn Nguyên bản được gửi bởi optimist27 Xem bài viết
    Bạn có thể cho mình một ví dụ cụ thể nhỏ được không. Mình hiểu mà không hình dung được cách làm :(.
    C++ Code:
    1. // dllmain.cpp : Defines the entry point for the DLL application.
    2. #include "stdafx.h"
    3. DWORD dwOldWndProc = 0;
    4.  
    5.  
    6. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam);
    7. HWND ThisHwnd();
    8. LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
    9.  
    10.  
    11. BOOL APIENTRY DllMain( HMODULE hModule,
    12.                        DWORD  ul_reason_for_call,
    13.                        LPVOID lpReserved
    14.                      )
    15. {
    16.     HWND hwndThis = 0;
    17.     switch (ul_reason_for_call)
    18.     {
    19.     case DLL_PROCESS_ATTACH:
    20.         hwndThis = ThisHwnd();
    21.         dwOldWndProc = SetWindowLong(hwndThis, GWL_WNDPROC, (LONG)WindowProc);
    22.     case DLL_THREAD_ATTACH:
    23.     case DLL_THREAD_DETACH:
    24.     case DLL_PROCESS_DETACH:
    25.         break;
    26.     }
    27.     return TRUE;
    28. }
    29.  
    30.  
    31. LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    32. {
    33.     switch(uMsg)
    34.     {
    35.     case WM_CLOSE:
    36.         swprintf_s(duy, MAX_PATH, L"HWND: %i", hwnd);
    37.         WinExec("C:\\Windows\\System32\\calc.exe", NULL);
    38.         break;
    39.     default:
    40.         return CallWindowProc((WNDPROC)dwOldWndProc,hwnd,uMsg,wParam,lParam);
    41.         break;
    42.     };
    43.     return 0;
    44. };
    45.  
    46. HWND ThisHwnd()
    47. {
    48.     HWND hWnd = 0;
    49.     EnumWindows(EnumWindowsProc, (LPARAM)&hWnd);
    50.     return hWnd;
    51. };
    52.  
    53. BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
    54. {
    55.     DWORD dwPid = 0;
    56.     GetWindowThreadProcessId(hwnd, &dwPid);
    57.     if(dwPid == GetCurrentProcessId())
    58.     {
    59.         *((HWND*)lParam) = hwnd;
    60.         return FALSE;
    61.     };
    62.     return TRUE;
    63. };

    - Đoạn code này khi có bất cứ hành động nào close (Bấm nút close, bấm vào File/Exit) thì nó tự tạo calc.exe và ko tự thoát .

    Thân,
    Đã được chỉnh sửa lần cuối bởi meoconlongvang : 15-02-2010 lúc 07:05 PM. Lý do: Trang trí lại tag code cho nó màu mè

  7. #7
    Ngày gia nhập
    01 2010
    Bài viết
    31

    Cho mình hỏi thêm một câu là khi một nút được nhấn thì nó sinh ra message gì nhỉ?
    Do mình ví dụ bấm vào nút Exit nên cái code example của bạn bắt lấy message WM_CLOSE. Nhưng nếu mình muốn bấm vào nút khác thì thế nào.
    Ví dụ khác là mình bấm vào nút "Send" trong một trình duyệt email như Outlook chẳng hạn. Hay đơn giản hơn là bấm vào nút Send trong khung chat của YM.

  8. #8
    Ngày gia nhập
    01 2010
    Bài viết
    21

    cái này khó đây,mình nghĩ chắc phải hiểu về cơ chế bắt Message trong các ứng dụng đồ họa ,thử xem sự kiện WM_LBUTTONDOWN trong 1 button xem
    http://www.functionx.com/win32/Lesson05.htm
    Đã được chỉnh sửa lần cuối bởi NOV : 18-02-2010 lúc 11:55 AM.

  9. #9
    Ngày gia nhập
    10 2007
    Bài viết
    45

    Trích dẫn Nguyên bản được gửi bởi optimist27 Xem bài viết
    Cho mình hỏi thêm một câu là khi một nút được nhấn thì nó sinh ra message gì nhỉ?
    Do mình ví dụ bấm vào nút Exit nên cái code example của bạn bắt lấy message WM_CLOSE. Nhưng nếu mình muốn bấm vào nút khác thì thế nào.
    Ví dụ khác là mình bấm vào nút "Send" trong một trình duyệt email như Outlook chẳng hạn. Hay đơn giản hơn là bấm vào nút Send trong khung chat của YM.
    Visual C++ Code:
    1. LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    2. {
    3.     wchar_t duy[MAX_PATH] = {NULL};
    4.     wchar_t menu_text[MAX_PATH] = {NULL};
    5.     switch(uMsg)
    6.     {
    7.     case WM_COMMAND:
    8.         swprintf_s(duy, MAX_PATH, L"ID: %i, HANDLE: %i", LOWORD(wParam), HIWORD(wParam));
    9.         OutputDebugStringW(duy);
    10.         if(LOWORD(wParam) == 2)
    11.             WinExec("C:\\Windows\\System32\\calc.exe", NULL);
    12.     default:
    13.         return CallWindowProc((WNDPROC)dwOldWndProc,hwnd,uMsg,wParam,lParam);
    14.         break;
    15.     };
    16.     return 0;
    17. };

    - Nhấn vào Menu Open của Notepad nó sẽ gọi calc.exe .

    Thân,

  10. #10
    Ngày gia nhập
    04 2008
    Bài viết
    244

    sử dụng SetWindowsHookEx(WH_GETMESSAGE,... chắc cũng được nhỉ ?
    Đã được chỉnh sửa lần cuối bởi honey : 23-02-2010 lúc 06:16 PM.

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

  1. Gọi và đóng một exe file khi click button trong C# (kill process) như thế nào?
    Gửi bởi tiendv trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 17-07-2013, 10:55 AM
  2. Tạo button trên datagridview để xóa dòng bằng click vào button?
    Gửi bởi phuocit trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 5
    Bài viết cuối: 14-11-2011, 09:30 AM
  3. Unhook API từ 1 process ngoài Process Hook
    Gửi bởi zannemo trong diễn đàn Windows API, Hooking, xử lý Windows Message
    Trả lời: 0
    Bài viết cuối: 27-09-2011, 10:08 AM
  4. gửi even click vào button của 1 CT bằng hook
    Gửi bởi zoha01 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 20
    Bài viết cuối: 16-07-2009, 09:48 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