我如何接受MathML?

时间:2012-02-20 16:45:43

标签: winapi windows-7 mathml

我今天发现Windows 7带有非常令人印象深刻的MathPanel实用程序,用于执行方程式的手写识别:

enter image description here

哪个好。 (这里我输入了sRGB色彩空间伽玛转换部分的公式)

但现在我似乎无法任何事情。

有一个插入按钮。我会假设单击插入会将其插入到其后面活动的应用程序中(非常类似于屏幕键盘的工作原理):

enter image description here

除非我假设它将作为粘贴操作运行。

我在帮助中找不到应用程序使其工作所需的信息。没有提到某些软件必须支持的任何特殊API。

我也无法在MSDN上找到有关接受插入等式所需的特殊API的任何信息。

我必须实现什么API,注册,回调,监听器,消息,COM对象才能收到MathPanel输入?

我提到 MathML 的唯一原因是因为SuperUser mentioned MathML的回答:

  

理论上,任何支持 MathML (数学标记语言)的应用都可以与Windows 7数学输入面板一起使用。数学输入面板仅适用于支持MathML的程序。以下是一些此类应用:StarOffice,OpenOffice,Opera和Maple。

那我如何让我的程序支持MathML?

据我所知,MathML是一种标记语言;不是Windows API。这就像是说:“我如何让我的程序支持HTML?” Html是文本,您可以将其粘贴到任何地方。

除非我“支持”MathML,否则MathPad拒绝粘贴?


更新

点击插入后检查剪贴板上的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 个答案:

答案 0 :(得分:3)

监视发送到我窗口的邮件,看起来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");
  

注意: Appendix B of the W3C's Mathematical Markup Language (MathML) Version 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还允许您program the Math Input COM object

//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`,which无法通过C#完成。

但你不需要,你可以使用Ctrl+V

答案 1 :(得分:1)

我认为它被官方称为“数学输入面板”(MIP)。 MathType产品支持它并提供一个菜单项来运行它。正如此处提到的其他回复一样,单击MIP的“插入”按钮会将Ctrl-V发送到其下方的窗口。如果该窗口支持该键盘快捷键并处理MathML,那么它将起作用。

虽然MathML剪贴板格式是在粘贴上处理MathML输入的推荐方法,但如果要在应用程序中实现MathML支持,则还应接受以CF_UNICODETEXT形式提供的MathML文本。某些应用程序支持将MathML复制到剪贴板,但似乎不了解MathML剪贴板格式。当然,您的粘贴代码必须嗅探文本以识别MathML而不是常规的非MathML文本。您还应该考虑接受拖放和粘贴。

数学输入控制是一种相关但略有不同的MIP配置。如果我没记错的话,它缺少MIP的历史和其他一些功能。我们开始使用它来处理MathType,并很快意识到它没有任何优势。你应该忽略它,只支持MathML的粘贴和拖放。如果对您的应用有意义,请添加“数学输入面板”菜单项。

答案 2 :(得分:0)

剪贴板格式“MathML Presentation”实际上包含文本;我在使用Windows API GetClipboardData()之前尝试过这个。

此外,如果您将MathML片段作为纯文本(例如,CF_TEXT)复制到剪贴板,然后将其粘贴到Word文档,您也将获得纯文本,即Word不会将其解释为Presentation MathML。 / p>

对于Word,您必须将其复制为CF_TEXT和“MathML Presentation”。要获得后者的ID,请尝试将“MathML Presentation”注册为Ian Boyd建议的剪贴板格式。 Windows将返回其剪贴板格式ID;将此ID与SetClipboardData()一起使用。