1

我在外部应用程序(美国在线)中有一个所有者绘制的列表框,我需要从中获取数据以构建组件以帮助人们提高其可用性。(该实用程序将使某些事物的访问变得更加简单,等等)。

注意

我的 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
    );
4

1 回答 1

1

我有两篇关于这个主题的博客文章

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 是一个指向字符串的指针,它可能是应用程序的一些内部结构。

于 2011-01-13T14:16:48.040 回答