Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Trang 1 trên tổng số 8 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 71 kết quả

Đề tài: [winapi] Nháy đúp chuột vào Syslistview32 item

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

    Mặc định [winapi] Nháy đúp chuột vào Syslistview32 item

    Như tiêu đề, mình đang nghiên cứu về cái winapi, đặc biệt là cái sendmessage, mình thử dùng sendmessage để click ảo vào button, label, mọi thứ đều ok (mình không dùng UiAutomation vì mình không muốn nó chiếm chuột ), nhưng mình không thể nào click vào mấy item của Syslistview được, buồn :(. Mà đúng hơn là hông biết viết sao ). Không biết có pro nào về winapi này cho mình 1 ít thông tin được hông ạ
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    09 2016
    Bài viết
    1,009

    Sao không trình bày cái bạn làm được trước ?

    Xem thêm :
    http://diendan.congdongcviet.com/threads/t379156::import-mot-so-cot-file-excel-vao-datagridview.cpp

    Nó có giống listview trong regedit.exe không ?

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

    Trích dẫn Nguyên bản được gửi bởi fms17 Xem bài viết
    Sao không trình bày cái bạn làm được trước ?

    Xem thêm :
    http://diendan.congdongcviet.com/threads/t379156::import-mot-so-cot-file-excel-vao-datagridview.cpp

    Nó có giống listview trong regedit.exe không ?
    Không bạn ơi, cái list view này là của phần mềm khác, nên mình mới dùng sendmessage đó ạ

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    904

    Bạn đưa đoạn mã xác định các tham số trong lệnh SendMessage lên xem như thế nào.

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

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Bạn đưa đoạn mã xác định các tham số trong lệnh SendMessage lên xem như thế nào.
    Đầu tiên mình sử dụng TestStackWhite để get ListView Automation Element
    TestStack.White.UIItems.ListView ListView= window.Get<TestStack.White.UIItems.ListView>(Searc hCriteria.ByClassName("SysListView32"));
    Sau đó mình tiếp tục get
    CellId = ListView.Rows[0].Cells[0].AutomationElement.GetRuntimeId();
    Sau đó mình sử dụng SendMessage(CellId , WM_LBUTTONDBLCLK, 0, 0);
    Nhưng nó không work :(, dường nhu có click cái listview thay vì cell

    - - - Nội dung đã được cập nhật ngày 02-11-2016 lúc 10:55 AM - - -

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Bạn đưa đoạn mã xác định các tham số trong lệnh SendMessage lên xem như thế nào.
    Có thể tớ đã tìm ra câu trả lời , sử dụng LVM_GETNEXTITEM để select sau đó click,

  6. #6
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    904

    Mặc định [winapi] Nháy đúp chuột vào Syslistview32 item

    Hàm API SendMessage của Windows nhận tham số đầu tiên là một thẻ cửa sổ (kiểu HWND).
    Mình chưa tham khảo TestStack nhưng chắc rằng cái CellId không có kiểu HWND.
    Bạn xử lý chỗ này xong ta bàn tiếp các tham số kế tiếp.

    Cũng cần chú ý : ListView trong Windows có thể khác ListView trong .NET

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

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Hàm API SendMessage của Windows nhận tham số đầu tiên là một thẻ cửa sổ (kiểu HWND).
    Mình chưa tham khảo TestStack nhưng chắc rằng cái CellId không có kiểu HWND.
    Bạn xử lý chỗ này xong ta bàn tiếp các tham số kế tiếp.

    Cũng cần chú ý : ListView trong Windows có thể khác ListView trong .NET
    Thank bạn, đúng là cái cell không có hwnd , mình sử dụng LVM_GETNEXTITEM và ok rồi

  8. #8
    Ngày gia nhập
    09 2016
    Bài viết
    1,009

    Được rồi thôi, vì tôi biết trước, biết cả câu trả lời. Trong regedit.exe :
    - có cái bạn tìm (SysListView32) và
    - có cái bạn cần tương tác sendMessage

    Tách từ một CT thật có tiếng tăm (tìm khóa và hiện thị nó trên regEdit), winApi
    Visual C# Code:
    1. REHWnd = FindWindow("RegEdit_RegEdit", null);
    2. //...
    3. lvHwnd = FindWindowEx(REHWnd, 0, "SysListView32", null);
    4. //...
    5. SendMessage(lvHwnd, LVM_Msg, p1, p2);

    Coi như là thông báo đến mọi người :

    Nếu bạn không san sẻ điều bạn đã biết
    Ai người trợ giúp những khó khăn đang cần
    //Xem yêu cầu trên

  9. #9
    Ngày gia nhập
    03 2012
    Bài viết
    31

    Trích dẫn Nguyên bản được gửi bởi fms17 Xem bài viết
    Được rồi thôi, vì tôi biết trước, biết cả câu trả lời. Trong regedit.exe :
    - có cái bạn tìm (SysListView32) và
    - có cái bạn cần tương tác sendMessage

    Tách từ một CT thật có tiếng tăm (tìm khóa và hiện thị nó trên regEdit), winApi
    Visual C# Code:
    1. REHWnd = FindWindow("RegEdit_RegEdit", null);
    2. //...
    3. lvHwnd = FindWindowEx(REHWnd, 0, "SysListView32", null);
    4. //...
    5. SendMessage(lvHwnd, LVM_Msg, p1, p2);

    Coi như là thông báo đến mọi người :

    Nếu bạn không san sẻ điều bạn đã biết
    Ai người trợ giúp những khó khăn đang cần
    //Xem yêu cầu trên
    Bạn có thể cho mình tham khảo code của truơng trình này không?, mình đã có thể select nhưng double click hoặc right click thì chưa được

    Code:
            public static voi SendDoubleClick(IntPtr lstview, int item)
            {
                const int dwBufferSize = 1024;
    
                int dwProcessID;
                string retval;
                bool bSuccess;
                IntPtr hProcess = IntPtr.Zero;
                IntPtr lpRemoteBuffer = IntPtr.Zero;
                IntPtr lpLocalBuffer = IntPtr.Zero;
                IntPtr threadId = IntPtr.Zero;
    
                try
                {
                    lpLocalBuffer = Marshal.AllocHGlobal(dwBufferSize);
                    // Get the process id owning the window
                    threadId = new IntPtr(GetWindowThreadProcessId(lstview, out dwProcessID));
    
                    if ((threadId == IntPtr.Zero) || (dwProcessID == 0))
                        throw new ArgumentException("hWnd");
    
                    // Open the process with all access
                    hProcess = OpenProcess(ProcessAccessFlags.All, false, dwProcessID);
                    if (hProcess == IntPtr.Zero)
                        throw new ApplicationException("Failed to access process");
    
                    // Allocate a buffer in the remote process
                    lpRemoteBuffer = VirtualAllocEx(hProcess, IntPtr.Zero, new IntPtr(dwBufferSize), AllocationType.Commit,
                      MemoryProtection.ReadWrite);
                    if (lpRemoteBuffer == IntPtr.Zero)
                        throw new SystemException("Failed to allocate memory in remote process");
    
                    // Fill in the LVITEM struct, this is in your own process
                    // Set the pszText member to somewhere in the remote buffer,
                    // For the example I used the address imediately following the LVITEM stuct
                    NMITEMACTIVATE nmitem = new NMITEMACTIVATE();
                    nmitem.hdr.code = NM_DBLCLK;
                    nmitem.hdr.idFrom = lstview;
                    nmitem.hdr.hwndFrom = threadId;
                    nmitem.iItem = item;
                    nmitem.iSubItem = 0;
                    IntPtr tmp = new IntPtr(0);
                    SendMessage(lstview, LVM_GETITEMPOSITION, new IntPtr(item), lpRemoteBuffer);
                    bSuccess = ReadProcessMemory(hProcess, lpRemoteBuffer, lpLocalBuffer, dwBufferSize, out tmp);
                    if (!bSuccess)
                        throw new SystemException("Failed to read from process memory");
                    POINT tmpPOINT = new POINT();
                    Marshal.PtrToStructure((IntPtr)lpLocalBuffer, tmpPOINT);
    
                    nmitem.ptAction = tmpPOINT;
    
    
                    // Copy the local LVITEM to the remote buffer
    
                    bSuccess = WriteProcessMemory(hProcess, lpRemoteBuffer, ref nmitem,
                      Marshal.SizeOf(typeof(NMITEMACTIVATE)), out tmp);
                    if (!bSuccess)
                        throw new SystemException("Failed to write to process memory");
    
                    // Send the message to the remote window with the address of the remote buffer
                    SendMessage(threadId, 0x004E, lstview, lpRemoteBuffer);
    
    
                }
                finally
                {
                    if (lpLocalBuffer != IntPtr.Zero)
                        Marshal.FreeHGlobal(lpLocalBuffer);
                    if (lpRemoteBuffer != IntPtr.Zero)
                        VirtualFreeEx(hProcess, lpRemoteBuffer, 0, FreeType.Release);
                    if (hProcess != IntPtr.Zero)
                        CloseHandle(hProcess);
                }
            }
    Đã được chỉnh sửa lần cuối bởi pikeman20 : 03-11-2016 lúc 12:49 AM.

  10. #10
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    904

    ////// Chờ xem thêm
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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