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

这很好。(在这里,我输入了sRGB颜色空间伽马变换的部分公式)
但现在我似乎不能用它做任何事。
有一个插入按钮。我假设单击插入会将其插入到其后面活动的应用程序中(就像屏幕上的键盘工作一样):

不过,我想它会像粘贴操作一样运行。
我在帮助中找不到任何信息,说明应用程序需要什么才能使其工作。没有提到任何特殊的API,有些软件必须支持。
我也无法在MSDN上找到任何关于接受插入等式所需的特殊API的信息。
为了接收MathPanel输入,我需要实现哪些API、注册、回调、侦听器、消息、COM对象?
我提到MathML的唯一原因是因为对SuperUser提到MathML的回答
理论上,任何支持MathML (数学标记语言)的应用程序都可以与Windows7Math输入面板一起使用。数学输入面板只对支持MathML的程序使用。下面是一些这样的应用: StarOffice、OpenOffice、Opera和Maple。
那么,如何使我的程序支持MathML呢?
据我所知,MathML是一种标记语言,而不是Windows。这就像在说,“如何使我的程序支持HTML?”Html是文本,你可以把它粘贴到任何地方。
MathPad拒绝粘贴,除非我“支持”MathML?
更新
在单击IDataObject Insert之后,检查剪贴板上的,可以看到两种可用的格式(这两种格式都不是文本,这解释了为什么我没有得到任何标记):
格式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)因此,至少现在我有了一些剪贴板格式:
我仍然无法在MSDN上找到任何关于剪贴板格式的内容。
发布于 2012-02-20 20:36:17
监视发送到我窗口的消息,看起来像Math Input Panel应用程序发送了一个Ctrl+V
VK_CONTROLV密钥VK_CONTROLV密钥所以你需要认识到有人试图点击Ctrl+V,然后你必须提取内容。
首先注册三种剪贴板格式:
Handle CF_MathML_Presentation = RegisterClipboardFormat("MathML Presentation");
Handle CF_MathML_Content = RegisterClipboardFormat("MathML Content");
Handle CF_MathML = RegisterClipboardFormat("MathML");注释: W3C数学标记语言(MathML) 3.0版附录B文档要注册的剪贴板格式名称:
MathMLMathML PresentationMathML 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!微软还允许您使用编写数学输入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, andAdvise` `,哪一个不能从C#中完成。
但是你不需要这样做,你可以直接使用Ctrl+V。
发布于 2012-02-21 20:55:16
我认为它被正式称为“数学输入面板”(MIP)。MathType产品支持它,并提供一个菜单项来运行它。正如其他回复中提到的,单击MIP的插入按钮将向其下方的窗口发送一个Ctrl。如果该窗口支持该键盘快捷方式并处理MathML,那么它将工作。
虽然MathML剪贴板格式是在粘贴上处理MathML输入的推荐方法,但如果您在应用程序中实现MathML支持,则还应该接受以CF_UNICODETEXT形式提供的MathML文本。有些应用程序支持将MathML复制到剪贴板上,但似乎不知道MathML剪贴板的格式。当然,您的粘贴代码必须嗅探文本以识别MathML,而不是常规的非MathML文本。你也应该考虑接受拖放和粘贴。
Math输入控件是MIP的一个相关但略有不同的配置。如果我没记错的话,它缺乏MIP的历史和其他一些特征。我们开始为MathType使用它,并很快意识到它没有好处。您应该忽略它,只需支持MathML的粘贴和拖放。添加一个数学输入面板菜单项,如果这对你的应用是有意义的。
发布于 2012-12-29 16:34:02
剪贴板格式"MathML表示“实际上包含文本;在使用Windows ()之前,我已经尝试过了。
此外,如果将MathML片段复制到剪贴板上为纯文本(例如,CF_TEXT),然后将其粘贴到Word文档中,您也将得到纯文本,即Word不会将其解释为表示MathML。
要做到这一点,您必须同时将其复制为CF_TEXT和"MathML演示文稿“。要获得后者的ID,请尝试将"MathML表示“注册为Ian建议的剪贴板格式。Windows将返回其剪贴板格式ID;将此ID与SetClipboardData()一起使用。
https://stackoverflow.com/questions/9364890
复制相似问题