C# WinAPI Чтение содержимого SysListView32

227
25 апреля 2018, 03:59
[DllImport("User32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
static extern IntPtr FindWindow(
    [In, Optional] [MarshalAs(UnmanagedType.LPTStr)] string lpClassName,
    [In, Optional] [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);
[DllImport("User32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
static extern IntPtr FindWindowEx(
    [In, Optional] IntPtr hwndParent,
    [In, Optional] IntPtr hwndChildAfter,
    [In, Optional] [MarshalAs(UnmanagedType.LPTStr)] string lpszClass,
    [In, Optional] [MarshalAs(UnmanagedType.LPTStr)] string lpszWindow);
[DllImport("User32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
static extern IntPtr SendMessage(
    [In] IntPtr hWnd,
    [In] uint Msg,
    [In] IntPtr wParam,
    [In] IntPtr lParam);
[DllImport("Kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
static extern IntPtr VirtualAllocEx(
    [In] IntPtr hProcess,
    [In, Optional] IntPtr lpAddress,
    [In] uint dwSize,
    [In] uint flAllocationType,
    [In] uint flProtect);
[DllImport("Kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool VirtualFreeEx(
    [In] IntPtr hProcess,
    [In] IntPtr lpAddress,
    [In] uint dwSize,
    [In] uint dwFreeType);
[DllImport("Kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
static extern bool WriteProcessMemory(
    [In] IntPtr hProcess,
    [In] IntPtr lpBaseAddress,
    [In] ref LVITEM lpBuffer,
    [In] int nSize,
    out uint lpNumberOfBytesWritten);
[DllImport("Kernel32.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Auto)]
static extern bool ReadProcessMemory(
    [In] IntPtr hProcess,
    [In] IntPtr lpBaseAddress,
    [In] IntPtr lpBuffer,
    [In] uint nSize,
    [Out] uint lpNumberOfBytesRead);
const int LVM_FIRST = 0x1000;
const int LVM_GETITEMCOUNT = LVM_FIRST + 4;
const int LVM_GETITEMTEXT = LVM_FIRST + 115;
const int HDM_GETITEMCOUNT = 0x1200;
const int MAX_LVITEM_TEXT_SIZE = 512;
const int MEM_COMMIT = 0x00001000;
const int PAGE_READWRITE = 0x04;
const int MEM_RELEASE = 0x00008000;
const int LVIF_TEXT = 0x0001;
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct LVITEM {
    public uint mask;
    public int iItem;
    public int iSubItem;
    public uint state;
    public uint stateMask;
    public IntPtr pszText;
    public int cchTextMax;
    public int iImage;
    public IntPtr lParam;
    public int iIndent;
    public int iGroupId;
    public uint cColumns;
    public IntPtr puColumns;
    public IntPtr piColFmt;
    public int iGroup;
}
static void Main(string[] args) {
    // ...
    const int lvItemSize = 76;
    IntPtr hWnd = FindWindow(null, "<Window Name>");
    IntPtr hSysListView32 = FindWindowEx(hWnd, IntPtr.Zero, "SysListView32", null);
    IntPtr hSysHeader32 = FindWindowEx(hSysListView32, IntPtr.Zero, "SysHeader32", "");
    if (hSysHeader32 == IntPtr.Zero) return;
    int itemsCount = (int)SendMessage(hSysListView32, LVM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);
    int colCount = (int)SendMessage(hSysHeader32, HDM_GETITEMCOUNT, IntPtr.Zero, IntPtr.Zero);
    Console.Write("Items: {0}\nColumns: {1}\n", itemsCount, colCount);
    IntPtr lpLocalBuffer = Marshal.AllocHGlobal(MAX_LVITEM_TEXT_SIZE);
    IntPtr lpLvItem = VirtualAllocEx(proc.Handle, IntPtr.Zero, lvItemSize, MEM_COMMIT, PAGE_READWRITE);
    IntPtr lpText = VirtualAllocEx(proc.Handle, IntPtr.Zero, MAX_LVITEM_TEXT_SIZE, MEM_COMMIT, PAGE_READWRITE);
    LVITEM lvItem = new LVITEM();
    for (int i = 0; i < itemsCount; i++) {
        Console.Write("\n\n".PadLeft(50, '-') + "\n".PadLeft(50, '-'));
        for (int j = 0; i < colCount; j++) {
            lvItem.mask = LVIF_TEXT;
            lvItem.iSubItem = j;
            lvItem.iItem = i;
            lvItem.pszText = lpText;
            lvItem.cchTextMax = MAX_LVITEM_TEXT_SIZE;
            WriteProcessMemory(proc.Handle, lpLvItem, ref lvItem, lvItemSize, out uint written);
            int symbolsCount = (int)SendMessage(hSysListView32, LVM_GETITEMTEXT, (IntPtr)i, lpLvItem);
            if (symbolsCount > 0) {
                ReadProcessMemory(proc.Handle, lpText, lpLocalBuffer, MAX_LVITEM_TEXT_SIZE, 0);
                Console.WriteLine(Marshal.PtrToStringUni(lpLocalBuffer));
            }
        }
    }
    Console.ReadKey();
    if (lpLocalBuffer != IntPtr.Zero)
        Marshal.FreeHGlobal(lpLocalBuffer);
    if (lpLvItem != IntPtr.Zero)
        VirtualFreeEx(proc.Handle, lpLvItem, 0, MEM_RELEASE);
    if (lpText != IntPtr.Zero)
        VirtualFreeEx(proc.Handle, lpText, 0, MEM_RELEASE);
    // ...
}

Данный код предназначен для получения содержимого SysListView32. Значения каждого элемента в каждом столбце. Подскажите, какая ошибка допущена здесь, если SendMessage с параметром LVM_GETITEMTEXT всегда возвращает 0.

Проблем с самим окном быть не может.

READ ALSO
Как включить source-map для css в приложении create-react-app?

Как включить source-map для css в приложении create-react-app?

Переношу шаблон в CRAСтили ведут себя не вполне правильно

185
При дебаге в VS-2015 asp.net mvc скрипт не сохраняется

При дебаге в VS-2015 asp.net mvc скрипт не сохраняется

Есть скрипт на jsОн подключается в представлении

177
Обработка адреса сайта

Обработка адреса сайта

Добрый вечерЕсть такое условие:

152
Как повернуть по вертикале `dots` в slick slider?

Как повернуть по вертикале `dots` в slick slider?

Как повернуть точки с горизонтального положения в вертикальное?

144