1

私は現在、C++アプリを移植する過程にありC#、この特定の機能を変換するのに問題があります。この関数は、指定されたウィンドウ ハンドルのテキスト/タイトルを取得します。

重要な部分は、SendMessageTimeoutW私が想定しているウィンドウのテキストを取得する2つの呼び出しであることがわかりましたが、残りはわかりません。

また、UTF-16 関数の P/Invoke 署名が見つからないため、この投稿SendMessageTimeoutWに示されているように、呼び出しはSendMessageTimeout同等になりますか?

public static unsafe string GetWindowText(IntPtr hWnd)
{

    // THIS PART MAY NOT BE NEEDED
    string str2 = null;
    WinHookEx* exPtr3;
    WinHookEx* exPtr = @new(4);
    try
    {
        exPtr3 = (exPtr == null) ? null : WinHookEx.{ctor}(exPtr);
    }
    fault
    {
        delete((void*) exPtr);
    }
    WinHookEx* exPtr2 = exPtr3;
    *((int*) exPtr2) = hWnd.ToPointer();
    HWND__* hwnd__Ptr = (HWND__*) hWnd.ToPointer();
    uint modopt(IsLong) num = 0;
    delete((void*) exPtr2);


    // 1st call to SendMessageTimeoutW
    if (SendMessageTimeoutW(hwnd__Ptr, 14, 0, 0, 2, 0x3e8, &num) == 0)
    {
        return null;
    }

    // whats happening here?
    num++;
    uint modopt(IsLong) num2 = num;
    char* chPtr = @new((num2 > 0x7fffffff) ? uint.MaxValue : ((uint) (num2 * 2)));
    chPtr[0] = '\0';

    // 2nd call to SendMessageTimeoutW
    if (SendMessageTimeoutW(hwnd__Ptr, 13, num, (int modopt(IsLong)) chPtr, 2, 0x3e8, &num) == 0)
    {
        return null;
    }
    str2 = new string(chPtr);
    delete((void*) chPtr);
    return str2;
}

この関数を暫定的に に移植しましC#たが、常に空白文字列を返します。文字列ビルダーを初期化しようとしましnew StringBuilder(256)たが、それでも機能しません。

私は何を間違えましたか?

public static unsafe string GetWindowText(IntPtr hWnd){

    // send WM_GETTEXTLENGTH 
    if (SendMessageTimeout(hWnd, 14, 0, 0, 2, 0x3e8, IntPtr.Zero) == 0){
        return null;
    }

    // send WM_GETTEXT
    StringBuilder sb = new StringBuilder();
    if (SendMessageTimeout(hWnd, 13, 0, sb, 2, 0x3e8, IntPtr.Zero) == 0){
        return null;
    }

    return sb.ToString();
}
4

2 に答える 2