我在外部应用程序(美国在线)中有一个所有者绘制的列表框,我需要从中获取数据以构建组件以帮助人们提高其可用性。(该实用程序将使某些事物的访问变得更加简单,等等)。
注意
我的 C++ 知识很差。我是一名 C# 程序员。
我有hWnd
问题的列表框,但它似乎是所有者绘制的。使用LB_GETTEXT
返回错误数据,我只是得到垃圾(它在我的调试器中呈现为一堆汉字)并且通过LB_GETITEMDATA
返回大致相同。
我相信这是因为所有者绘制的列表框上有图形。做了很多挖掘,我过去发现其他人有这个问题。我发现了以下应该解决此问题的代码。然而事实并非如此。代码发布在下面,以及它下面的问题。
void GetListItemData( HWND hListWnd, long index, char *outputResult )
{
int result;
DWORD processID;
HANDLE hProcess;
char *itemData;
char sDataRead[5];
DWORD bytes;
DWORD lListItemHold, lListItemDataHold;
*outputResult=0;
if( hListWnd )
{
GetWindowThreadProcessId( hListWnd, &processID );
hProcess=OpenProcess( 0x10|0xf0000|PROCESS_VM_READ, 0, processID );
if( hProcess )
{
lListItemHold=(DWORD)SendMessage( hListWnd, LB_GETITEMDATA, index-1, 0 );
lListItemHold=lListItemHold+24;
result=ReadProcessMemory( hProcess, (void *)lListItemHold, &sDataRead, 4, &bytes );
if( !result )
{
RaiseWinErr();
}
memcpy( &lListItemDataHold, &sDataRead, 4 );
lListItemDataHold=lListItemDataHold+6;
ReadProcessMemory( hProcess, (void *)lListItemDataHold, outputResult, 16, &bytes );
CloseHandle( hProcess );
}
}
}
我的理解虽然有限,但它lListItemHold=lListItemHold+24
试图解释 ListBox 中的任何“结构”并通过它的前 24 个字节,然后返回剩余的内容。但是,这似乎对我不起作用。
任何人都可以对我可以尝试的事情有所了解吗?我知道我正抓着稻草。我在 C# 中对此进行编码,因此使用以下函数使用此函数p/invoke
;
[DllImport("GetListItemData.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void RetrieveListItem(
System.IntPtr hWnd,
System.Int32 index,
[MarshalAs(UnmanagedType.LPArray)]byte[] buffer
);
[DllImport("GetListItemData.dll", CallingConvention = CallingConvention.Cdecl)]
internal static extern void RetrieveListItem(
System.IntPtr hWnd,
System.Int32 index,
[MarshalAs(UnmanagedType.LPTStr)]System.Text.StringBuilder buffer
);