如何获得桌面图表的坐标来接收我的100分吧

解决方案 »

  1.   

     GetWindowRect
     ClientToScreen(
      

  2.   

    IntPtr hDeskTop = IntPtr.Zero;
    hDeskTop = Win32.FindWindow("Progman", "Program Manager");
    hDeskTop = Win32.FindWindowEx(hDeskTop, IntPtr.Zero, "SHELLDLL_DefView", null);
    hDeskTop = Win32.FindWindowEx(hDeskTop, IntPtr.Zero, "SysListView32", null);
    if (hDeskTop != IntPtr.Zero)
    {
        uint lpNumberOfBytesRead = 0;
        int count = GetListViewItemCount(hDeskTop);
        Console.WriteLine(count);
        IntPtr lpdwProcessId = IntPtr.Zero;
        Win32.GetWindowThreadProcessId(hDeskTop, ref lpdwProcessId);
        IntPtr hProcess = Win32.OpenProcess(PROCESS_ACCESS.PROCESS_ALL_ACCESS, false, (uint)lpdwProcessId);
        IntPtr ptrPointer = Win32.VirtualAllocEx(hProcess, IntPtr.Zero, (uint)Marshal.SizeOf(typeof(Point)), (uint)(MEMState.MEM_RESERVE | MEMState.MEM_COMMIT), (uint)PAGEProtection.PAGE_READWRITE);
        Point pt = new Point();
        int size = Marshal.SizeOf(typeof(Point));
        IntPtr ptrTemp = Marshal.AllocHGlobal(size);
        Marshal.StructureToPtr(pt, ptrTemp, false);
        for (int i = 0; i < count; ++i)
        {
            if (Win32.SendMessage(hDeskTop, (int)ListViewMessages.LVM_GETITEMPOSITION, i, ptrPointer) != IntPtr.Zero)
            {
    Win32.ReadProcessMemory(hProcess, ptrPointer, ptrTemp, size, lpNumberOfBytesRead);
    pt = (Point)Marshal.PtrToStructure(ptrTemp, typeof(Point));
    Console.WriteLine(pt.ToString());
            }
        }
        Marshal.FreeHGlobal(ptrTemp);
        Win32.VirtualFreeEx(hProcess, ptrPointer, 0, (uint)MEMState.MEM_RELEASE);
        Win32.CloseHandle(hProcess);
    }int GetListViewItemCount(IntPtr hWnd)
    {
        return Win32.SendMessage(hWnd, (int)ListViewMessages.LVM_GETITEMCOUNT, 0, 0);
    }//所需
    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
    [DllImport("user32.dll", EntryPoint = "FindWindowEx")]
    public static extern IntPtr FindWindowEx(IntPtr hWnd1, IntPtr hWnd2, string lpsz1, string lpsz2);
    [DllImport("kernel32.dll")]
    public static extern IntPtr OpenProcess(PROCESS_ACCESS dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, [In, Out] uint vNumberOfBytesRead);
    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
    [DllImport("user32.dll", CharSet=CharSet.Ansi,EntryPoint="SendMessageA")]
    public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint dwFreeType);
    [DllImport("kernel32.dll", EntryPoint = "CloseHandle", SetLastError = true, CharSet = CharSet.Auto)]
    public static extern IntPtr CloseHandle(IntPtr hObject);public enum PROCESS_ACCESS : uint
    {
    PROCESS_ALL_ACCESS = 0x001F0FFF,
    PROCESS_VM_OPERATION = 0x0008,
    PROCESS_VM_READ = 0x0010,
    PROCESS_VM_WRITE = 0x0020,
    PROCESS_QUERY_INFORMATION = 0x0400
    }
    public enum MEMState : uint
    {
    MEM_COMMIT = 0x1000,
            MEM_RESERVE = 0x2000,
            MEM_DECOMMIT = 0x4000,
            MEM_RELEASE = 0x8000,
            MEM_FREE = 0x10000,
            MEM_PRIVATE = 0x20000,
            MEM_MAPPED = 0x40000,
            MEM_RESET = 0x80000,
            MEM_TOP_DOWN = 0x100000,
            MEM_WRITE_WATCH = 0x200000,
            MEM_PHYSICAL = 0x400000,
            MEM_LARGE_PAGES = 0x20000000,
            MEM_4MB_PAGES = 0x80000000
    }
    public enum PAGEProtection : uint
    {
    PAGE_NOACCESS = 0x01,
    PAGE_READONLY = 0x02,
    PAGE_READWRITE = 0x04,
            PAGE_WRITECOPY = 0x08,
            PAGE_EXECUTE = 0x10,
            PAGE_EXECUTE_READ = 0x20,
            PAGE_EXECUTE_READWRITE = 0x40,
            PAGE_EXECUTE_WRITECOPY = 0x80,
            PAGE_GUARD = 0x100,
            PAGE_NOCACHE = 0x200,
            PAGE_WRITECOMBINE = 0x400
    }
    public enum ListViewMessages {
    LVM_FIRST =  0x1000,
    LVM_GETSUBITEMRECT = (LVM_FIRST + 56),
    LVM_GETITEMSTATE     = (LVM_FIRST + 44),
    LVM_GETITEMTEXTW     = (LVM_FIRST + 115),
    LVM_INSERTITEMA = (LVM_FIRST + 7),
    LVM_INSERTITEMW      = (LVM_FIRST + 77),
    LVM_INSERTCOLUMNA    = (LVM_FIRST + 27),
    LVM_INSERTCOLUMNW    = (LVM_FIRST + 97),
    LVM_DELETECOLUMN    = (LVM_FIRST + 28),
    LVM_GETCOLUMNA       = (LVM_FIRST + 25),
    LVM_GETCOLUMNW       = (LVM_FIRST + 95),
    LVM_SETEXTENDEDLISTVIEWSTYLE  = (LVM_FIRST + 54),  
    LVM_SETITEMA         = (LVM_FIRST + 6),
    LVM_SETITEMW = (LVM_FIRST + 76),
    LVM_EDITLABELA           = (LVM_FIRST + 23),
    LVM_EDITLABELW = (LVM_FIRST + 118),
    LVM_DELETEITEM           = (LVM_FIRST + 8),
    LVM_SETBKCOLOR          = (LVM_FIRST + 1),
    LVM_GETBKCOLOR           = (LVM_FIRST + 0),
    LVM_GETTEXTBKCOLOR       = (LVM_FIRST + 37),
    LVM_SETTEXTBKCOLOR = (LVM_FIRST + 38),
    LVM_DELETEALLITEMS       = (LVM_FIRST + 9),
    LVM_GETNEXTITEM          = (LVM_FIRST + 12),
    LVM_SETITEMCOUNT         = (LVM_FIRST + 47),
    LVM_GETITEMCOUNT         = (LVM_FIRST + 4),
    LVM_SETCOLUMNWIDTH           = (LVM_FIRST + 30),
    LVM_GETITEMRECT          = (LVM_FIRST + 14),
            LVM_GETITEMPOSITION         = (LVM_FIRST + 16),
    LVM_EDITLABEL = (LVM_FIRST + 23)
    }