Пример использования EM_STREAMOUT с c # и RichEditBox - PullRequest
1 голос
/ 13 июля 2010

Я пытаюсь получить текст из поля RichEdit с помощью WM_GETTEXT, но у меня возникли некоторые проблемы, поэтому я обнаружил EM_STREAMOUT, это специально для RichEdit. Я нашел этот код и играл немного с этим, но я не могу заставить их работать:

delegate uint EditStreamCallback(IntPtr dwCookie, IntPtr pbBuff, int cb, out int pcb);

struct EDITSTREAM
{
public IntPtr dwCookie;
public uint dwError;
public EditStreamCallback pfnCallback;
}

[DllImport("user32.dll", CharSet=CharSet.Auto)]
static extern IntPtr SendMessage(HandleRef hwnd, uint msg, uint wParam, ref EDITSTREAM lParam);

Может быть, у кого-то есть рабочий пример использования этого в c #?

спасибо Дэвид

1 Ответ

1 голос
/ 15 марта 2011

Пожалуйста, проверьте, подойдет ли вам приведенный ниже пример:

private string ReadRTF(IntPtr handle)
{
    string result = String.Empty;
    using (MemoryStream stream = new MemoryStream())
    {
        EDITSTREAM editStream = new EDITSTREAM();
        editStream.pfnCallback = new EditStreamCallback(EditStreamProc);
        editStream.dwCookie = stream;

        SendMessage(handle, EM_STREAMOUT, SF_RTF, editStream);

        stream.Seek(0, SeekOrigin.Begin);
        using (StreamReader reader = new StreamReader(stream))
        {
            result = reader.ReadToEnd(); 
        }
    }
    return result;
}

private int EditStreamProc(MemoryStream dwCookie, IntPtr pbBuff, int cb, out int pcb)
{
    pcb = cb;
    byte[] buffer = new byte[cb];
    Marshal.Copy(pbBuff, buffer, 0, cb);
    dwCookie.Write(buffer, 0, cb);
    return 0;
}

private delegate int EditStreamCallback(MemoryStream dwCookie, IntPtr pbBuff, int cb, out int pcb);

[StructLayout(LayoutKind.Sequential)]
private class EDITSTREAM
{
    public MemoryStream dwCookie;
    public int dwError;
    public EditStreamCallback pfnCallback;
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hwnd, uint msg, uint wParam, ref EDITSTREAM lParam);

public const int WM_USER = 0x0400;
public const int EM_STREAMOUT = WM_USER + 74;
public const int SF_RTF = 2;

вот как это можно назвать:

string temp = ReadRTF(richTextBox1.Handle);
Console.WriteLine(temp);

в моем тесте richedit это возвращает следующую строку:

{\ rtf1 \ ANSI \ ansicpg1252 \ deff0 \ deflang1033 {\ fonttbl {\ f0 \ fnil \ fcharset0 Microsoft Sans Serif;}} \ viewkind4 \ uc1 \ pard \ qc \ f0 \ fs17 test параграф \ par \ pard тестовый параграф \ par } * +1010 *

надеюсь, это поможет, с уважением

...