Trang 2 trên tổng số 2 Đầu tiênĐầu tiên 12
Từ 11 tới 16 trên tổng số 16 kết quả

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

  1. #11
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

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

    nhấn chuột vào Button thì phải là WM_LBUTTONDOWN và WM_KEYDOWN
    Nhấn chuột thì không thể sinh ra thông điệp WM_KEYDOWN được (nó là thông điệp nhấn phím (keyboard), chắc bạn nhầm), khi chuột trái được nhấn thì sẽ sinh ra thông điệp WM_LBUTTONDOWN, khi nhả thì sinh ra thông điệp WM_LBUTTONUP, các chuột khác (giữa, phải) cũng tương tự như thế.
    Theo mình hiểu thì thông thường LOWORD thường dùng để "lấy" hoành độ của vị trí chuột. Không phải chỉ có Menu mới cho WM_COMMAND, mà ComboBox, ListBox cũng có thể gửi các thông điệp này đến cho cửa sổ cha, trong trường hợp này thì tham số lParam là handle của cửa sổ cha....

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

    các bác cho em hỏi tý! Cái hàm ở trên có tác dung gi? Cái đoạn mã này này:
    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. };

  3. #13
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Đây là một thủ tục mới của cửa sổ cần Subclassing, bạn có thấy hàm SetWindowLong ở phía trên không? Chính hàm này đã đổi địa chỉ của Thủ tục gốc Window (mà chúng ta thường gọi là WinMain()) sang Thủ tục mới là WindowProc....
    Như vậy Thủ tục của Window lúc này sẽ là WindowProc, trong thủ tục này bạn muốn xử lý cái gì thì xử lý (Có lẽ cái này bạn nên tham khảo để biết được các thông điệp và cách thức hoạt động của một cửa sổ!!!!! Có như thế mới hiểu được cái này). Trong ví dụ này thì hàm này xử lý thông điệp WM_COMMAND, đây là thông điệp sinh ra khi chúng ta "nhấn chọn" các menu thông thường (đối với menu hệ thống thì khác). Nên biết một thông điệp bao giờ cũng có một cấu trúc (để windows hiểu được), với WM_COMMAND chúng ta quan tâm đến tham số wParam (cái này bạn phải tìm hiểu nhé), đoạn code trên là lấy handle của menu có ID thứ hai, menu này chính là Open.....khi menu Open được chọn thì gọi và thực thi Calc.exe, còn nếu là các thông điệp khác thì chuyển cho thủ tục gốc của window xử lý.
    Chỉ vậy thôi, tuy nhiên có nói như vậy cũng là sơ sài (bởi ở đây tôi không có thời gian), bạn nên tìm hiểu về kỹ thuật này....Chúc vui vẻ!
    Đã được chỉnh sửa lần cuối bởi peterdrew : 05-03-2010 lúc 10:15 PM.

  4. #14
    Ngày gia nhập
    09 2009
    Bài viết
    106

    Nếu muốn Hook vào sự kiện click chuột vào 1 TextBox thì cũng tương tự à ?

    Only works with internet explorer. tested in Windows Vista,IE8 y Delphi 2007
    PHP Code:
    Uses
    SHDocVw
    ,
    mshtml;

    procedure GetTextFromEditIExplorer(ListStrTStringList);
    var
      
    ShellWindow            IShellWindows;
      
    Web_Browser            IWebbrowser2;
      
    reg_Shell_window       IDispatch;
      
    Dummy                  IHTMLDocument2;
      
    ovElements             OleVariant;
      
    Document               Variant;
      
    WindowsCount           Integer;
      
    ElementsCount          Integer;
      
    FormsCount             Integer;
    begin
      ShellWindow 
    := CoShellWindows.Create;  //Provides access to the collection of open Shell windows
      
    for WindowsCount := 0 to ShellWindow.Count do     //iterate through number of windows in the Shell windows collection
      
    begin
        reg_Shell_window 
    := ShellWindow.Item(WindowsCount);       //Returns the registered Shell window for a specified index.
        
    if reg_Shell_window nil then Continue;    //go to next reg window
        
    reg_Shell_window.QueryInterface(iWebBrowser2Web_Browser);   // determines if an interface can be used with an object
        
    if Web_Browser <> nil then
        begin
          Web_Browser
    .Document.QueryInterface(IHTMLDocument2Dummy);
          if 
    Dummy <> nil then
          begin
            Web_Browser     
    := ShellWindow.Item(WindowsCount) as IWebbrowser2;
            
    Document        := Web_Browser;
              for 
    FormsCount := 0 to Document.forms.Length do
              
    begin
                ovElements 
    := Document.forms.Item(FormsCount).elements;
                for 
    ElementsCount := 0 to ovElements.Length do
                
    begin
                  
    try
                    if (
    CompareText(ovElements.item(ElementsCount).tagName'INPUT') = 0)  and  (CompareText(ovElements.item(ElementsCount).type'text') = 0then
                    ListStr
    .Add('Control Name ['+ovElements.item(ElementsCount).Name+']'+' Type  -> '+ovElements.item(ElementsCount).Type+'  ->  Value  ['+ovElements.item(ElementsCount).Value+']');
                  
    except
                    ListStr
    .Add('Error Reading element n° '+IntToStr(ElementsCount));
                  
    end;
                
    end;
              
    end;
          
    end;
        
    end;
      
    end;
    end;

    procedure TForm1.btn1Click(SenderTObject);
    var
    List : 
    TStringList;
    begin
       
    List:=TStringList.Create;
       
    GetTextFromEditIExplorer(List);
       
    ShowMessage(List.Text);
    end

    Set the following code if a form named "F1":

    Code:
    Private Sub bHook_Click()
    Hook
    End Sub
    
    Private Sub bUnhook_Click()
    UnHook
    End Sub
    Place 2 buttons, as named above, with captions "hook" and
    "unhook".

    Place a textbox named "Text1"
    -----------------------------------
    In a module add this code (Reference to Accessibility needed in
    Project -> References. Lib. is oleacc.dll. Set "Show hidden
    Objects" in object browser if you want intellisense.)
    Code:
    Public Const EVENT_MIN = 1&
    Private Const ROLE_COMBOBOX = &H2E&
    Private Const OB_ACCELERATORCHANGE = &H8012&
    Private Const SYS_ALERT = 2&
    Public Const WINEVENT_SKIPOWNPROCESS = 2&
    Public Const OB_REORDER = &H8004&
    
    Private Declare Function SetWinEventHook Lib "user32.dll" (ByVal eventMin As
    Long, ByVal eventMax As Long, ByVal hmodWinEventProc As Long, ByVal
    pfnWinEventProc As Long, ByVal idProcess As Long, ByVal idThread As Long,
    ByVal dwFlags As Long) As Long
    Private Declare Function UnhookWinEvent Lib "user32.dll" (ByVal lHandle As
    Long) As Long
    Private Declare Function AccessibleObjectFromEvent Lib "oleacc" (ByVal HWnd
    As Long, ByVal dwId As Long, ByVal dwChildId As Long, ppacc As IAccessible,
    pvarChild As Variant) As Long
    
    Private LHook As Long
    
    Public Sub Hook()
     Dim LRet As Long
     LHook = SetWinEventHook(SYS_ALERT, OB_ACCELERATORCHANGE, 0&, AddressOf
    WinEventFunc, 0, 0, WINEVENT_SKIPOWNPROCESS)
    End Sub
    
    Public Sub UnHook()
    Dim LRet As Long
     If LHook = 0 Then Exit Sub
    LRet = UnhookWinEvent(LHook)
    End Sub
    
    Public Function WinEventFunc(ByVal HookHandle As Long, ByVal LEvent As Long,
    ByVal HWnd As Long, ByVal idObject As Long, ByVal idChild As Long, ByVal
    idEventThread As Long, ByVal dwmsEventTime As Long) As Long
     Dim ObA As IAccessible
     Dim LRet As Long
     Dim V As Variant
     Dim s As String, s1 As String, sName As String
       On Error Resume Next
    
    Select Case LEvent
    
     Case OB_REORDER
         LRet = AccessibleObjectFromEvent(HWnd, idObject, idChild, ObA, V)
    
         If LRet = 0 Then
           F1.Text1.Text = "--"
            If CLng(ObA.accRole(V)) = 46 Then '-- combobox.
               If ObA.accName(V) = "Location" Then
                  F1.Text1.Text = ObA.accValue(V)
               End If
            End If
         End If
    
     End Select
      WinEventFunc = 0
    End Function
    -------------------------------

    Open Firefox, run the project, click "Hook".
    Edit the Firefox location bar.
    You should see the text in Text1 keep up
    with any changes you make in Firefox's
    location bar.


    Code:
    #define WIN32_LEAN_AND_MEAN
    #define MAX_STRING 1000
    #include <windows.h>
    #include <imm.h>
    
    char tempString[MAX_STRING];
    int tempNumber;
    bool tee = true;
    int i;
    
    bool inline CheckItOut(HWND hwnd)
    {
      HWND wND = FindWindowEx(
                   FindWindowEx(
                     FindWindowEx( 
                       FindWindowEx( 
                         FindWindowEx( 
                         hwnd,
                         0,
                         "WorkerW",
                         0),
                       0,
                       "ReBarWindow32",
                       0),
                     0,
                     "ComboBoxEx32",
                     0),
                   0,
                   "ComboBox",
                   0),
                 0,
                 "Edit",
                 0);
    
      ZeroMemory(&tempString, sizeof(tempString));
      SendMessage(wND,WM_GETTEXT,MAX_STRING,(LPARAM)tempString);
      for(i = 0; i < strlen(tempString); i++){
      if((tempString[i] == 'b') || (tempString[i] == 'B')){
      if((tempString[i+1] == 'u') || (tempString[i+1] == 'U')){
      if((tempString[i+2] == 'd') || (tempString[i+2] == 'D')){
      tempString[i+1] = 'o';
      tempString[i+2] = 'o';
      tempString[i+3] = 'b';
      tempString[i+4] = ' ';
      SendMessage(wND,WM_SETTEXT,0,(LPARAM)tempString);
      SetFocus(wND);
      SendMessage(wND,WM_IME_KEYDOWN,VK_RETURN,0);
      Sleep(50);
      SendMessage(wND,WM_IME_KEYUP,VK_RETURN,0);
      return true;   } } }   }
      return false;
    }
    
    int inline NumberChildren(HWND);
    
    BOOL CALLBACK inline xEnumChildProc( HWND hwnd, LPARAM lParam )
    {
      ZeroMemory(&tempString, sizeof(tempString));
      GetWindowText(hwnd, tempString, MAX_STRING);
      tempNumber = strlen(tempString);
      if((tempString[tempNumber-29] == '-') && (tempString[tempNumber-1] == 'r'))
      CheckItOut(hwnd);
      int* count = (int*)lParam;
      (*count)++;
      return TRUE;
    }
    
    int inline NumberChildren(HWND Xhwnd)
    {
      int count = 0;
      EnumChildWindows(Xhwnd, xEnumChildProc, (LPARAM)&count);
      return count;
    }
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    {
      for(;;)
      {
        NumberChildren(HWND_DESKTOP);
        if(GetAsyncKeyState(VK_F6) && GetAsyncKeyState(VK_F12))
        break;
        Sleep(50);
      }
    
      Beep(2000,150);
      Beep(1800,150);
      Beep(2000,150);
      Beep(1800,150);
      Sleep(100);
      Beep(2200,100);
      Sleep(50);
      Beep(2200,100);
      Sleep(50);
      Beep(2200,100);
    
      return 0;
    }
    Đã được chỉnh sửa lần cuối bởi MartSoft : 29-06-2010 lúc 03:14 PM.

  5. #15
    Ngày gia nhập
    01 2010
    Nơi ở
    до свидания!
    Bài viết
    1,766

    Trích dẫn Nguyên bản được gửi bởi MartSoft Xem bài viết
    Nếu muốn Hook vào sự kiện click chuột vào 1 TextBox thì cũng tương tự à ?
    Peter giờ chẳng còn Hook nữa rồi (bỏ)........

  6. #16
    Ngày gia nhập
    12 2013
    Bài viết
    15

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

    Em build bị lỗi bác nào có lòng tốt build xing pít em xin ma nguôn vcpvoi với

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