Как мне принять MathML? - PullRequest
       7

Как мне принять MathML?

4 голосов
/ 20 февраля 2012

Сегодня я обнаружил, что Windows 7 поставляется с очень впечатляющей утилитой MathPanel для распознавания уравнений почерком:

enter image description here

Это нормально.(Здесь я ввел формулу для части гамма-преобразования цветового пространства sRGB)

Но теперь я, похоже, не могу делать что-либо с ним.

Есть кнопка Вставить .я бы предположил, что нажатие Вставить вставит его в приложение, которое за ним активно (так же, как работает экранная клавиатура):

enter image description here

За исключениемя предполагаю, что это будет работать как операция вставки.

Я не могу найти в справке никакой информации о том, что требуется приложению для его работы.Нет никакого упоминания о каком-либо специальном API, который должно поддерживать некоторое программное обеспечение.

Также я не могу найти в MSDN никакой информации о том, какой специальный API требуется для принятия вставки уравнения.

Какой API, регистрация, обратный вызов, слушатель, сообщение, COM-объект у меня естьреализовать так, чтобы я получал входные данные MathPanel?

Единственная причина, о которой я упоминаю MathML , заключается в том, что в ответе SuperUser упоминается MathML :

Теоретически любое приложение, поддерживающее MathML (язык математической разметки), можно использовать с панелью ввода Windows 7 Math.Панель ввода Math работает только с программами, поддерживающими MathML.Вот несколько таких приложений: StarOffice, OpenOffice, Opera и Maple.

Ну, как мне заставить мою программу поддерживать MathML?

Насколько язнать MathML - язык разметки;не Windows API.Это все равно что сказать: «Как мне заставить мою программу поддерживать HTML?»Html - это текст, и вы можете вставить его куда угодно.

MathPad отказывается вставлять, если я не "поддерживаю" MathML?


Обновление

Осматривая IDataObject в буфере обмена после нажатия Вставить , я вижу два доступных формата (ни один из которых не является текстовым, что объясняет, почему я не получаю никакой разметки):

Формат 1:

     CLIPFORMAT cfFormat: "MathML Presentation" (49839)
PDVTargetDevice ptd:      0x00000000
          DWORD dwAspect: DVASPECT_CONTENT
          DWORD lindex:   -1
          DWORD tymed:    1  (TYMED_HGLOBAL)

Формат 2:

     CLIPFORMAT cfFormat:"MathML" (49838)
PDVTargetDevice ptd:      0x00000000
          DWORD dwAspect: DVASPECT_CONTENT
          DWORD lindex:   -1
          DWORD tymed:    1  (TYMED_HGLOBAL)

Так что, по крайней мере, теперь у меня есть несколько форматов буфера обмена:

  • "MathML Presentation"
  • "MathML"

Я до сих пор не могу найти в MSDN ничего о форматах буфера обмена.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2012

Следите за сообщениями, отправленными в мое окно, похоже, что приложение Math Input Panel отправляет Ctrl+V:

  • WM_KEYDOWN (0x11) VK_CONTROL
  • WM_KEYDOWN (0x56) V ключ
  • WM_CHAR (0x16)
  • WM_KEYUP (0x11) VK_CONTROL
  • WM_KEYUP (0x56) V ключ

Так что вам нужно признать, что кто-то пытается нажать Ctrl + V. Затем вы должны извлечь содержимое.

Сначала зарегистрируйте три формата буфера обмена:

Handle CF_MathML_Presentation = RegisterClipboardFormat("MathML Presentation");
Handle CF_MathML_Content = RegisterClipboardFormat("MathML Content");
Handle CF_MathML = RegisterClipboardFormat("MathML");

Примечание: Приложение B к языку математической разметки W3C (MathML) версии 3.0 документирует имена форматов буфера обмена Windows, которые должны быть зарегистрированы:

  • Общий MathML Имя буфера обмена Windows: MathML
  • Презентация MathML Имя буфера обмена Windows: MathML Presentation
  • Содержимое MathML Имя буфера обмена Windows: MathML Content

Затем получите указатель на IDataObject в буфере обмена:

IDataObject dataObject;
OleGetClipboard(dataObject);

Затем перечислите все форматы, ища тот, который вам нравится:

IEnumFORMATETC enum;
dataObject.EnumFormatEtc(DATADIR_GET, out enum);

String mathXml = "";

foreach (FormatEtc format in enum)
{
    if (format.cfFormat = CF_MathML_Presentation) ||
       (format.cfFormat = CF_MathML_Content) ||
       (format.cfFormat = CF_MathML)
    {
        //We know how to handle these formats:
        STGMEDIUM medium;
        dataObject.GetData(format.cfFormat, out medium);

        mathXml = GetStringFromStorageMedium(medium); //handles all the nasty HGlobal/IStream/IStorage nonsense
    }
}

ShowMessage(mathXml); //tada!

Microsoft также позволяет программировать Math Input COM-объект :

//Create the COM object
IMathInputControl mathInputControl = CreateComObject(CLSID_MathInputControl);
mathInputControl.Show();

Затем можно создать объект, который получает уведомления о событиях:

class MathEvents : _IMathInputControlEvents
{
    public HRESULT Insert(String mathXml)
    {
       //Notifies the event handler when the Insert button is clicked.
       MessageBox.Show(mathXml);
       return S_OK;
    }

    public HRESULT Clear()
    {
       //Notifies the event handler when the Clear button is clicked.      
       return S_OK;
    }

    public HRESULT Close()
    {
       //Notifies the event handler when the Close button is clicked.
       return S_OK;
    }

    public HRESULT PaintHRESULT Paint(LONG_PTR hdc, LONG Left, LONG Top, LONG Right, LONG Bottom, LONG Element, LONG State)
    {
       //Notifies the event handler when the buttons and background of the control require painting.
       return S_OK;           
    }

Отсутствующий компонент - это как дать mathInputControl ссылку на наш объект обратного вызова.

Это сверхсекретный сложный COM-код, включающий ConnectionPointContainer, and Advise`, , который нельзя сделать из C #.

Но вам не нужно, вы можете просто использовать Ctrl+V.

1 голос
/ 22 февраля 2012

Я думаю, что она официально называется "Math Input Panel" (MIP). Продукт MathType поддерживает его и предоставляет пункт меню для его запуска. Как упоминалось в других ответах, нажатие кнопки «Вставить» MIP отправляет Ctrl-V в окно под ним. Если это окно поддерживает сочетание клавиш и MathML, оно будет работать.

Хотя формат буфера обмена MathML является рекомендуемым способом обработки ввода MathML для вставки, если вы реализуете поддержку MathML в своем приложении, вы также должны принять текст MathML, предлагаемый как CF_UNICODETEXT. Некоторые приложения поддерживают копирование MathML в буфер обмена, но, похоже, не знают о формате MathML Clipboard. Конечно, ваш код вставки должен будет прослушивать текст, чтобы идентифицировать MathML, а не обычный текст, не относящийся к MathML. Вам также следует рассмотреть возможность перетаскивания и вставки.

Math Input Control - это связанная, но немного другая конфигурация MIP. Если я правильно помню, ему не хватает истории и некоторых других функций MIP. Мы начали работать с ним для MathType и быстро поняли, что в этом нет никакого преимущества. Вы должны просто игнорировать это и просто поддерживать вставку и перетаскивание MathML. Добавьте пункт меню Math Input Panel, если это имеет смысл для вашего приложения.

0 голосов
/ 29 декабря 2012

Формат буфера обмена «MathML Presentation» фактически содержит текст;Я пробовал это перед использованием Windows API GetClipboardData ().

Более того, если вы скопируете фрагмент MathML в буфер обмена как обычный текст (например, CF_TEXT), а затем вставите его в документ Word, вы будететакже получить простой текст, т. е. Word НЕ будет интерпретировать его как Presentation MathML.

Чтобы Word мог это сделать, вам необходимо скопировать его как CF_TEXT и как «MathML Presentation».Чтобы получить идентификатор последнего, попробуйте зарегистрировать «MathML Presentation» в формате буфера обмена, как это было предложено Яном Бойдом.Windows вернет свой идентификатор формата буфера обмена;используйте этот идентификатор с SetClipboardData ().

...