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

Đề tài: Hỏi về cách hook các thuộc tính của 1 window?

  1. #1
    Ngày gia nhập
    11 2017
    Bài viết
    3

    Mặc định Hỏi về cách hook các thuộc tính của 1 window?

    Các bạn cho mình hỏi làm cách nào để hook được các thuộc tính của 1 window ? hiện mình chỉ hook dc các tên handle vs lại classname và caption name của nó nhưng mình muốn hook luôn được thuộc tính của 1 handle ví dụ: như mình muốn hook thanh menu của 1 app .net đơn giản và kết quả là ra hết các thuộc tính của thanh winform đó.
    (mình có kham khảo một số tool mẫu như hawkeye runtime object editor nhưng mà mình muốn lấy hết tất cả thuộc tính của một windows thay vì phải click chuột).
    Hiện nay source code của mình chỉ lấy được mấy thuộc tính ở top-level kiểu như trên nền của winform có cái gì là nó lấy cái đó thôi
    Code:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Runtime.InteropServices;
    using System.Drawing;
    using System.Diagnostics;
    using System.Reflection;
    using System.Windows;
    public class WindowHandleInfo
    {
        private delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
    
        [DllImport("user32")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr lParam);
    
        private IntPtr _MainHandle;
    
        public WindowHandleInfo(IntPtr handle)
        {
            this._MainHandle = handle;
        }
    
        public List<IntPtr> GetAllChildHandles()
        {
            List<IntPtr> childHandles = new List<IntPtr>();
    
            GCHandle gcChildhandlesList = GCHandle.Alloc(childHandles);
            IntPtr pointerChildHandlesList = GCHandle.ToIntPtr(gcChildhandlesList);
    
            try
            {
                EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
                EnumChildWindows(this._MainHandle, childProc, pointerChildHandlesList);
            }
            finally
            {
                gcChildhandlesList.Free();
            }
    
            return childHandles;
        }
    
        private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
        {
            GCHandle gcChildhandlesList = GCHandle.FromIntPtr(lParam);
    
            if (gcChildhandlesList == null || gcChildhandlesList.Target == null)
            {
                return false;
            }
    
            List<IntPtr> childHandles = gcChildhandlesList.Target as List<IntPtr>;
            childHandles.Add(hWnd);
    
            return true;
        }
    }
    class Program
    {
        [DllImport("user32.dll")]
        private static extern bool IsWindowVisible(int hWnd);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int GetWindowText(int hWnd, StringBuilder title, int size);
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetClassName(IntPtr hwnd, StringBuilder lpClassName, int nMaxCount);
        [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern long GetWindowText(IntPtr hwnd, StringBuilder lpString, long cch);
        [DllImport("User32.dll")]
        static extern IntPtr GetParent(IntPtr hwnd);
        [DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern long GetClassName(IntPtr hwnd, StringBuilder lpClassName, long nMaxCount);
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        static extern int GetWindowTextLength(IntPtr hWnd);
        static string GetClassNameOfWindow(IntPtr hwnd)
        {
            string className = "";
            StringBuilder classText = null;
            try
            {
                int cls_max_length = 1000;
                classText = new StringBuilder("", cls_max_length + 5);
                GetClassName(hwnd, classText, cls_max_length + 2);
    
                if (!String.IsNullOrEmpty(classText.ToString()) && !String.IsNullOrWhiteSpace(classText.ToString()))
                    className = classText.ToString();
            }
            catch (Exception ex)
            {
                className = ex.Message;
            }
            finally
            {
                classText = null;
            }
            return className;
        }
        static string GetCaptionOfWindow(IntPtr hwnd)
        {
            string caption = "";
            StringBuilder windowText = null;
            try
            {
                int max_length = GetWindowTextLength(hwnd);
                windowText = new StringBuilder("", max_length + 5);
                GetWindowText(hwnd, windowText, max_length + 2);
    
                if (!String.IsNullOrEmpty(windowText.ToString()) && !String.IsNullOrWhiteSpace(windowText.ToString()))
                    caption = windowText.ToString();
            }
            catch (Exception ex)
            {
                caption = ex.Message;
            }
            finally
            {
                windowText = null;
            }
            return caption;
        }
    
        static void Main(string[] args)
        {
    
            Process[] localByName = Process.GetProcessesByName("notepad");
            var allChildWindows = new WindowHandleInfo(localByName[0].MainWindowHandle).GetAllChildHandles();
            IntPtr handle = localByName[0].MainWindowHandle;
            Console.WriteLine("Process Name:" + localByName[0].ProcessName);
    
            var ClassName = new StringBuilder(255);
        
            foreach (IntPtr childhandle in allChildWindows)
            {
                Console.WriteLine("Child handle:" + GetClassNameOfWindow(childhandle));
            }
    
    
        }
    }
    h mình muốn lấy được hết các thuộc tính của một winform object (như chương trình trong link này https://www.codeproject.com/Articles/14292/Runtime-Object-Editor) mà mình ko biết s hook dc nữa mong mọi người chỉ dẫn?
    Đã được chỉnh sửa lần cuối bởi trangtrikiet : 17-11-2017 lúc 10:24 PM.

  2. #2
    Ngày gia nhập
    08 2017
    Bài viết
    348

    Trích dẫn Nguyên bản được gửi bởi trangtrikiet Xem bài viết
    Các bạn cho mình hỏi làm cách nào để hook được các thuộc tính của 1 window ? hiện mình chỉ hook dc các tên handle vs lại classname và caption name của nó nhưng mình muốn hook luôn được thuộc tính của 1 handle ví dụ: như mình muốn hook thanh menu của 1 app .net đơn giản và kết quả là ra hết các thuộc tính của thanh winform đó.
    (mình có kham khảo một số tool mẫu như hawkeye runtime object editor nhưng mà mình muốn lấy hết tất cả thuộc tính của một windows thay vì phải click chuột)
    Bạn làm được những gì thì trình bày ra, thiên hạ ngứa mắt xúm vào tranh luận, bạn sẽ học được nhiều điều, thậm chí những v/d, khía cạnh chưa hề nghĩ tới.
    Còn hỏi chay, ai rảnh trả lời. Họ có gia đình, công việc, bàn bè; hơi đâu trả lời cho bạn.

    Bạn thường ngày có giúp ai không ?

  3. #3
    Ngày gia nhập
    11 2017
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    Bạn làm được những gì thì trình bày ra, thiên hạ ngứa mắt xúm vào tranh luận, bạn sẽ học được nhiều điều, thậm chí những v/d, khía cạnh chưa hề nghĩ tới.
    Còn hỏi chay, ai rảnh trả lời. Họ có gia đình, công việc, bàn bè; hơi đâu trả lời cho bạn.

    Bạn thường ngày có giúp ai không ?
    à bữa mình quên up source code để mình bổ sung vào.

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

    Bạn nêu từng thuộc tính cụ thể muốn nhận, chung chung rất khó, đánh số vào.
    Thuộc tính có tới cả trăm, vài cái thì viết ở mức độ này, vài cái thì ở mức cao hơn, có cái nhận đơn giản trong C# nhưng có cái nhận trên C-Windows tốt hơn. Mục đích chỉ là nhận (Read) không thôi hay là có thay đổi (Write). Một cửa sổ trên nền .NET có thể khác với cửa sổ truyền thống.
    Yêu mã hơn yêu em !!!

  5. #5
    Ngày gia nhập
    08 2017
    Bài viết
    348

    Hook là gì ? Bạn muốn làm gì với Hook?
    Trình bày không có nghĩa là show code; các ý tưởng, ý muốn trong đầu bạn làm sao cho người khác hiểu ?


    Tôi không muốn phải đánh vần từng chữ để hiểu cốt chứa gì, làm gì(, làm như vậy rất mệt).
    Tôi chỉ đọc code khi cần kiểm tra nó làm đúng / làm sai mong muốn đặt ra thể hiện qua chú thích - comments

  6. #6
    Ngày gia nhập
    08 2017
    Bài viết
    348

    Mặc định Hỏi về cách hook các thuộc tính của 1 window?

    Trong cviet có vài topic đủ cho bạn tư duy, học tập trước khi thực hiện ý đồ trên, ex:
    window spy

  7. #7
    Ngày gia nhập
    11 2017
    Bài viết
    3

    Trích dẫn Nguyên bản được gửi bởi Monre Xem bài viết
    Trong cviet có vài topic đủ cho bạn tư duy, học tập trước khi thực hiện ý đồ trên, ex:
    window spy
    cảm ơn bạn nhiều nha để mình kham khảo thêm

Tags của đề tài này

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