Отладка останавливается в RichEdit SendMessageC#

Место общения программистов C#
Ответить
Anonymous
 Отладка останавливается в RichEdit SendMessage

Сообщение Anonymous »

Я пытаюсь следовать рекомендациям в этом сообщении блога, в котором рассказывается об использовании SendMessage в RichEdit с флагами EM_STREAMOUT и SF_BINARY и SF_HTML, чтобы получить HTML-содержимое из элемента управления RichEdit. Я работаю на C#.
https://devblogs.microsoft.com/math-in- ... l-support/
Когда я вызываю SendMessage, отладка в Visual Studio останавливается и никаких исключений не создается. Есть идеи, почему? Как я могу получить отладочную информацию?
private static MemoryStream? memoryStream;

public static class WMConstants
{
public const uint WM_USER = 0x0400;
public const uint EM_STREAMOUT = WM_USER + 74;

public const uint SF_HTML = 0x00100000;
public const uint SF_BINARY = 0x0008;
public const uint SF_CLIPBOARD = 0x80000000;
}

[DllImport("user32.dll", CharSet = CharSet.Auto)]
[SuppressMessage("Interoperability", "SYSLIB1054:Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time", Justification = "")]
private static extern IntPtr SendMessage(IntPtr hwnd, uint msg, uint wParam, ref EDITSTREAM lParam);

internal static string ReadHtml(IntPtr handle)
{
memoryStream = new MemoryStream();
var result = string.Empty;

var editStream = new EDITSTREAM
{
dwCookie = IntPtr.Zero,
pfnCallback = EditStreamProc,
};

try
{
_ = SendMessage(
hwnd: handle,
msg: WMConstants.EM_STREAMOUT,
wParam: WMConstants.SF_BINARY | WMConstants.SF_HTML, // | WMConstants.SF_CLIPBOARD,
lParam: ref editStream);

memoryStream.Seek(0, SeekOrigin.Begin);
using (var reader = new StreamReader(memoryStream))
{
result = reader.ReadToEnd();
}
}
catch (Exception ex)
{
// Log the exception if needed
throw new InvalidOperationException("Failed to read HTML from the RichTextBox.", ex);
}
finally
{
memoryStream?.Dispose();
memoryStream = null;
}

return result;
}

public static int EditStreamProc(IntPtr dwCookie, IntPtr pbBuff, int cb, out int pcb)
{
pcb = cb;
var buffer = new byte[cb];
Marshal.Copy(pbBuff, buffer, 0, cb);
memoryStream!.Write(buffer, 0, cb);
return 0;
}

[StructLayout(LayoutKind.Sequential)]
private struct EDITSTREAM
{
public IntPtr dwCookie;
public uint dwError;
public EditStreamCallback pfnCallback;
}


Подробнее здесь: https://stackoverflow.com/questions/786 ... endmessage
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»