[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.
Проблем с самим окном быть не может.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Переношу шаблон в CRAСтили ведут себя не вполне правильно
Есть скрипт на jsОн подключается в представлении
Как повернуть точки с горизонтального положения в вертикальное?