簡體   English   中英

C#p /調用,從所有者繪制的列表框中讀取數據

[英]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試圖說明L​​istBox中的任何“結構”,並通過它的前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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM