[英]C# p/invoke, Reading data from an Owner Drawn List Box
我在外部應用程序(《 美國在線》 )中擁有一個所有者繪制的列表框,我需要從中獲取數據以構建組件來幫助人們提高其可用性。 (該實用程序將使某些事物的訪問更加簡單,等等)。
我對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
);
我有兩個關於該主題的博客文章
http://taylorza.blogspot.com/2009/08/archive-hacking-my-way-across-process.html http://taylorza.blogspot.com/2010/06/crossing-process-boundary-with-net .html
但是,這些用於ListView控件,但是您可能需要看一下代碼。 第二篇文章是使用P / Invoke在.NET中實現這一點。
1-為什么要在lListItemHold中添加24?
2-確定lListItemhold是指向字符串的指針,它可能是應用程序的某些內部結構。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.