2012-02-20 82 views
4

今天我發現,Windows 7自帶了非常可觀的MathPanel工具,用於執行方程的手寫識別:我如何接受MathML?

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是文本,你可以將它粘貼到任何地方。

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演示」
  • 「MATHML」

我仍然無法找到MSDN上任何事情無論是剪貼板格式。

+2

看起來應用程序有責任註冊剪貼板更新,然後將「MathML」條目作爲XML; http://dpcarlisle.blogspot.com/2010/01/mathml-on-clipboard.html – 2012-02-20 17:13:53

回答

3

刺探發送到我的窗口消息,貌似Math Input Panel應用程序發送一個Ctrl+V

  • WM_KEYDOWN(0×11)VK_CONTROL
  • WM_KEYDOWN(0x56儲存)V關鍵
  • WM_CHAR(0x16)
  • WM_KEYUP(0×11)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! 

微軟還允許您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

我認爲它被正式稱爲「數學輸入面板」(MIP)。 MathType產品支持它並提供一個菜單項來運行它。正如其他回覆在這裏提到的,單擊MIP的插入按鈕將Ctrl-V發送到它下面的窗口。如果該窗口支持該鍵盤快捷鍵並處理MathML,那麼它將起作用。

儘管MathML剪貼板格式是處理粘貼上的MathML輸入的推薦方式,但如果您在應用程序中實現MathML支持,則還應該接受以CF_UNICODETEXT形式提供的MathML文本。有些應用程序支持將MathML複製到剪貼板,但似乎不瞭解MathML剪貼板格式。當然,你的粘貼代碼將不得不嗅探文本來識別MathML,而不是普通的非MathML文本。您還應該考慮接受拖放以及粘貼。

數學輸入控制是MIP的一個相關但略有不同的配置。如果我沒有記錯,它缺少MIP的歷史和其他一些特徵。我們開始使用MathType,很快意識到它沒有優勢。你應該忽略它,只是支持粘貼和拖放MathML。如果對您的應用程序有意義,請添加一個數學輸入面板菜單項。

0

剪貼板格式「MathML Presentation」實際上包含文本;在使用Windows API GetClipboardData()之前,我已經試過了。此外,如果您將MathML片段作爲純文本(例如CF_TEXT)複製到剪貼板,然後將其粘貼到Word文檔中,您也將獲得純文本,即Word不會將其解釋爲Presentation MathML。

對於Word來說,您必須將其複製爲CF_TEXT和「MathML Presentation」。要獲得後者的ID,請嘗試按照Ian Boyd的建議註冊「MathML Presentation」作爲剪貼板格式。 Windows將返回其剪貼板格式ID;將此ID與SetClipboardData()一起使用。