您的位置:首页 > 编程语言 > C#

C#获取外部程序ListView中的数据

2012-02-17 20:59 573 查看
转自 http://www.zu14.cn/2010/03/18/dotnet-csharp-get-external-listview-data-by-windows-api/trackback/
此文章,主要实现了C#利用Windows Api 获取外部程序中的ListView控件中的数据,也算是C# 使用API的一个高级一些的例子吧。

下面列出API相关的声明部分:

/// <summary>

/// 作者: 三角猫

/// 网址: http://www.zu14.cn/

/// 声明: 转载请务必保留原作者信息

/// </summary>

const uint LVM_FIRST = 0x1000;

const uint HDM_FIRST = 0x1200;

const uint LVM_GETITEMCOUNT = LVM_FIRST + 4;

const uint LVM_GETITEMW = LVM_FIRST + 75;

const uint LVM_GETHEADER = LVM_FIRST + 31;

const uint HDM_GETITEMCOUNT = HDM_FIRST + 0;

[DllImport("user32.DLL")]

static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

[DllImport("user32.DLL")]

static extern IntPtr FindWindow(string lpszClass, string lpszWindow);

[DllImport("user32.DLL")]

static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("user32.dll")]

static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint dwProcessId);

const uint PROCESS_VM_OPERATION = 0x0008;

const uint PROCESS_VM_READ = 0x0010;

const uint PROCESS_VM_WRITE = 0x0020;

[DllImport("kernel32.dll")]

static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

const uint MEM_COMMIT = 0x1000;

const uint MEM_RELEASE = 0x8000;

const uint MEM_RESERVE = 0x2000;

const uint PAGE_READWRITE = 4;

[DllImport("kernel32.dll")]

static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

[DllImport("kernel32.dll")]

static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint dwFreeType);

[DllImport("kernel32.dll")]

static extern bool CloseHandle(IntPtr handle);

[DllImport("kernel32.dll")]

static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);

[DllImport("kernel32.dll")]

static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint vNumberOfBytesRead);

public struct LVITEM

{

public int mask;

public int iItem;

public int iSubItem;

public int state;

public int stateMask;

public IntPtr pszText;

public int cchTextMax;

public int iImage;

public IntPtr lParam;

public int iIndent;

public int iGroupId;

public int cColumns;

public IntPtr puColumns;

}

int LVIF_TEXT = 0x0001; 几个操作LISTVIEW的自定义函数/// <summary>

/// 获取 ListView 的行数

/// </summary>

/// <param name="hwnd"></param>

/// <returns></returns>

int ListView_GetItemCount(IntPtr hwnd)

{

return SendMessage(hwnd, LVM_GETITEMCOUNT, 0, 0);

}

/// <summary>

/// 获取 ListView 的标题栏句柄

/// </summary>

/// <param name="hwnd"></param>

/// <returns></returns>

private IntPtr ListView_GetHeader(IntPtr hwnd)

{

return (IntPtr)SendMessage(hwnd, LVM_GETHEADER, 0, 0);

}

/// <summary>

/// 获取 ListView 的标题栏的列数

/// </summary>

/// <param name="header"></param>

/// <returns></returns>

private int Header_GetItemCount(IntPtr header)

{

return SendMessage(header, HDM_GETITEMCOUNT, 0, 0);

}

/// <summary>

/// 获取 ListView 的列数

/// </summary>

/// <param name="listViewHandle"></param>

/// <returns></returns>

int ListViewColumnCount(IntPtr listViewHandle)

{

return Header_GetItemCount(ListView_GetHeader(listViewHandle));

}

代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: