C # obtain external information through Win32 APIProgramSyslistview Value
Using system. runtime. interopservices;
Public const uint lvm_first = 0x1000;
Public const uint lvm_getitemcount = lvm_first + 4;
Public const uint lvm_getitemw = lvm_first + 75;
[Dllimport ("user32.dll")]
Public static extern int sendmessage (intptr hwnd, uint MSG, int wparam, int lparam );
[Dllimport ("user32.dll")]
Public static extern intptr findwindow (string lpszclass, string lpszwindow );
[Dllimport ("user32.dll")]
Public static extern intptr find1_wex (intptr hwndparent,
Intptr hwndchildafter, string lpszclass, string lpszwindow );
[Dllimport ("user32.dll")]
Public static extern uint getwindowthreadprocessid (intptr hwnd,
Out uint dwprocessid );
Public const uint process_vm_operation = 0x0008;
Public const uint process_vm_read = 0x0010;
Public const uint process_vm_write = 0x0020;
[Dllimport ("kernel32.dll")]
Public static extern intptr OpenProcess (uint dwdesiredaccess,
Bool binherithandle, uint dwprocessid );
Public const uint mem_commit = 0x1000;
Public const uint mem_release = 0x8000;
Public const uint mem_reserving = 0x2000;
Public const uint page_readwrite = 4;
[Dllimport ("kernel32.dll")]
Public static extern intptr virtualallocex (intptr hprocess, intptr lpaddress,
Uint dwsize, uint flallocationtype, uint flprotect );
[Dllimport ("kernel32.dll")]
Public static extern bool virtualfreeex (intptr hprocess, intptr lpaddress,
Uint dwsize, uint dwfreetype );
[Dllimport ("kernel32.dll")]
Public static extern bool closehandle (intptr handle );
[Dllimport ("kernel32.dll")]
Public static extern bool writeprocessmemory (intptr hprocess, intptr lpbaseaddress,
Intptr lpbuffer, int nsize, ref uint vnumberofbytesread );
[Dllimport ("kernel32.dll")]
Public 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; // string
Public int cchtextmax;
Public int iimage;
Public intptr lparam;
Public int iindent;
Public int igroupid;
Public int ccolumns;
Public intptr pucolumns;
}
Public int lvif_text = 0x0001;
Public int listview_getitemcount (intptr ahandle)
{
Return sendmessage (ahandle, lvm_getitemcount, 0, 0 );
}
Private void button#click (Object sender, eventargs E)
{
Intptr vhandle = findwindow ("#32770", "Windows Task Manager ");
Vhandle = findwindowex (vhandle, intptr. Zero, "#32770", null );
Vhandle = findwindowex (vhandle, intptr. Zero, "syslistview32", null );
If (vhandle = intptr. Zero) return;
Int vitemcount = listview_getitemcount (vhandle );
Uint vprocessid;
Getwindowthreadprocessid (vhandle, out vprocessid );
Intptr vprocess = OpenProcess (process_vm_operation | process_vm_read |
Process_vm_write, false, vprocessid );
Intptr vpointer = virtualallocex (vprocess, intptr. Zero, 4096,
Mem_reserve | mem_commit, page_readwrite );
Try
{
For (INT I = 0; I <vitemcount; I ++)
{
Byte [] vbuffer = new byte [256];
Lvitem [] vitem = new lvitem [1];
Vitem [0]. Mask = lvif_text;
Vitem [0]. iItem = I;
Vitem [0]. isubitem = 0;
Vitem [0]. cchtextmax = vbuffer. length;
Vitem [0]. psztext = (intptr) (INT) vpointer + marshal. sizeof (typeof (lvitem )));
Uint vnumberofbytesread = 0;
Writeprocessmemory (vprocess, vpointer,
Marshal. unsafeaddrofpinnedarrayelement (vitem, 0 ),
Marshal. sizeof (typeof (lvitem), ref vnumberofbytesread );
Sendmessage (vhandle, lvm_getitemw, I, vpointer. toint32 ());
Readprocessmemory (vprocess,
(Intptr) (INT) vpointer + marshal. sizeof (typeof (lvitem ))),
Marshal. unsafeaddrofpinnedarrayelement (vbuffer, 0 ),
Vbuffer. length, ref vnumberofbytesread );
String vtext = marshal. ptrtostringuni (
Marshal. unsafeaddrofpinnedarrayelement (vbuffer, 0 ));
Console. writeline (vtext );
}
}
Finally
{
Virtualfreeex (vprocess, vpointer, 0, mem_release );
Closehandle (vprocess );
}
}
C # obtain the value of the external program Treeview through Win32 API
Using system. runtime. interopservices;
Public const int TV _first = 0x1100;
Public const int tvm_getcount = TV _first + 5;
Public const int tvm_getnextitem = TV _first + 10;
Public const int tvm_getitema = TV _first + 12;
Public const int tvm_getitemw = TV _first + 62;
Public const int tvgn_root = 0x0000;
Public const int tvgn_next = 0x0001;
Public const int tvgn_previous = 0x0002;
Public const int tvgn_parents = 0x0003;
Public const int tvgn_child = 0x0004;
Public const int tvgn_firstvisible = 0x0005;
Public const int tvgn_nextvisible = 0x0006;
Public const int tvgn_previusvisible = 0x0007;
Public const int tvgn_drophilite = 0x0008;
Public constint tvgn_caret = 0x0009;
Public const int tvgn_lastvisible = 0x000a;
Public const int tvif_text = 0x0001;
Public const int tvif_image = 0x0002;
Public const int tvif_param = 0x0004;
Public const int tvif_state = 0x0008;
Public const int tvif_handle = 0x0010;
Public const int tvif_selectedimage = 0x0020;
Public const int tvif_children = 0x0040;
Public const int tvif_integral = 0x0080;
[Dllimport ("user32.dll")]
Public static extern int sendmessage (intptr hwnd,
Uint MSG, int wparam, int lparam );
[Dllimport ("kernel32.dll")]
Public static extern intptr OpenProcess (uint dwdesiredaccess,
Bool binherithandle, uint dwprocessid );
Public const uint mem_commit = 0x1000;
Public const uint mem_release = 0x8000;
Public const uint mem_reserving = 0x2000;
Public const uint page_readwrite = 4;
Public const uint process_vm_operation = 0x0008;
Public const uint process_vm_read = 0x0010;
Public const uint process_vm_write = 0x0020;
[Dllimport ("kernel32.dll")]
Public static extern intptr virtualallocex (intptr hprocess, intptr lpaddress,
Uint dwsize, uint flallocationtype, uint flprotect );
[Dllimport ("kernel32.dll")]
Public static extern bool virtualfreeex (intptr hprocess, intptr lpaddress,
Uint dwsize, uint dwfreetype );
[Dllimport ("kernel32.dll")]
Public static extern bool closehandle (intptr handle );
[Dllimport ("kernel32.dll")]
Public static extern bool writeprocessmemory (intptr hprocess, intptr lpbaseaddress,
Intptr lpbuffer, int nsize, ref uint vnumberofbytesread );
[Dllimport ("kernel32.dll")]
Public static extern bool readprocessmemory (intptr hprocess, intptr lpbaseaddress,
Intptr lpbuffer, int nsize, ref uint vnumberofbytesread );
[Dllimport ("user32.dll")]
Public static extern uint getwindowthreadprocessid (intptr hwnd,
Out uint dwprocessid );
[Structlayout (layoutkind. Sequential)]
Public struct tvitem
{
Public int mask;
Public intptr hitem;
Public int state;
Public int statemask;
Public intptr psztext;
Public int cchtextmax;
Public int iimage;
Public int iselectedimage;
Public int cChildren;
Public intptr lparam;
Public intptr htreeitem;
}
Public static uint treeview_getcount (intptr hwnd)
{
Return (uint) sendmessage (hwnd, tvm_getcount, 0, 0 );
}
Public static intptr treeview_getnextitem (intptr hwnd, intptr hitem, int code)
{
Return (intptr) sendmessage (hwnd, tvm_getnextitem, Code, (INT) hitem );
}
Public static intptr treeview_getroot (intptr hwnd)
{
Return treeview_getnextitem (hwnd, intptr. Zero, tvgn_root );
}
Public static intptr treeview_getchild (intptr hwnd, intptr hitem)
{
Return treeview_getnextitem (hwnd, hitem, tvgn_child );
}
Public static intptr treeview_getnextsibling (intptr hwnd, intptr hitem)
{
Return treeview_getnextitem (hwnd, hitem, tvgn_next );
}
Public static intptr treeview_getparent (intptr hwnd, intptr hitem)
{
Return treeview_getnextitem (hwnd, hitem, tvgn_parent );
}
Public static intptr treenodegetnext (intptr ahandle, intptr atreeitem)
{
If (ahandle = intptr. Zero | atreeitem = intptr. Zero) return intptr. zero;
Intptr result = treeview_getchild (ahandle, atreeitem );
If (result = intptr. Zero)
Result = treeview_getnextsibling (ahandle, atreeitem );
Intptr vparentid = atreeitem;
While (result = intptr. Zero & vparentid! = Intptr. Zero)
{
Vparentid = treeview_getparent (ahandle, vparentid );
Result = treeview_getnextsibling (ahandle, vparentid );
}
Return result;
}
Public static bool gettreeviewtext (intptr ahandle, list <string> aoutput)
{
If (aoutput = NULL) return false;
Uint vprocessid;
Getwindowthreadprocessid (ahandle, out vprocessid );
Intptr vprocess = OpenProcess (process_vm_operation | process_vm_read |
Process_vm_write, false, vprocessid );
Intptr vpointer = virtualallocex (vprocess, intptr. Zero, 4096,
Mem_reserve | mem_commit, page_readwrite );
Try
{
Uint vitemcount = treeview_getcount (ahandle );
Intptr vtreeitem = treeview_getroot (ahandle );
Console. writeline (vitemcount );
For (INT I = 0; I <vitemcount; I ++)
{
Byte [] vbuffer = new byte [256];
Tvitem [] vitem = new tvitem [1];
Vitem [0] = new tvitem ();
Vitem [0]. Mask = tvif_text;
Vitem [0]. hitem = vtreeitem;
Vitem [0]. psztext = (intptr) (INT) vpointer + marshal. sizeof (typeof (tvitem )));
Vitem [0]. cchtextmax = vbuffer. length;
Uint vnumberofbytesread = 0;
Writeprocessmemory (vprocess, vpointer,
Marshal. unsafeaddrofpinnedarrayelement (vitem, 0 ),
Marshal. sizeof (typeof (tvitem), ref vnumberofbytesread );
Sendmessage (ahandle, tvm_getitema, 0, (INT) vpointer );
Readprocessmemory (vprocess,
(Intptr) (INT) vpointer + marshal. sizeof (typeof (tvitem ))),
Marshal. unsafeaddrofpinnedarrayelement (vbuffer, 0 ),
Vbuffer. length, ref vnumberofbytesread );
Console. writeline (marshal. ptrtostringansi (
Marshal. unsafeaddrofpinnedarrayelement (vbuffer, 0 )));
Vtreeitem = treenodegetnext (ahandle, vtreeitem );
}
}
Finally
{
Virtualfreeex (vprocess, vpointer, 0, mem_release );
Closehandle (vprocess );
}
Return true;
}
Private void button#click (Object sender, eventargs E)
{
List <string> voutput = new list <string> ();
Gettreeviewtext (intptr) xxxx, voutput); // replace XXXX with the corresponding Treeview handle. For more information, see use findwindow ().
Foreach (string vline in voutput)
Console. writeline (vline );
}