4

私は今日、Windows7に方程式の手書き認識を実行するための非常に印象的なMathPanelユーティリティが付属していることを発見しました。

ここに画像の説明を入力してください

どちらでも構いません。(ここに、sRGB色空間ガンマ変換の一部の式を入力しました)

でも今は何もできないようです

挿入ボタンがあります。[挿入]をクリックすると、その背後でアクティブになっているアプリケーションに挿入されると思います(オンスクリーンキーボードが機能するのと同じように)。

ここに画像の説明を入力してください

私がそれが貼り付け操作として動作すると仮定することを除いて。

アプリケーションを機能させるために必要なものについての情報がヘルプに見つかりません。一部のソフトウェアがサポートしなければならない特別なAPIについては言及されていません。

また、方程式の挿入を受け入れるために必要な特別なAPIに関するMSDNの情報も見つかりません。

MathPanel入力を受け取るには、どのAPI、登録、コールバック、リスナー、メッセージ、COMオブジェクトを実装する必要がありますか?

私がMathMLに言及する唯一の理由は、 SuperUserの回答がMathMLに言及しているためです。

理論的には、MathML(Mathematical Markup Language)をサポートするアプリはすべて、Windows7の数学入力パネルで使用できます。Math Input Panelは、MathMLをサポートするプログラムでのみ機能します。そのようなアプリがいくつかあります:StarOffice、OpenOffice、Opera、Maple。

プログラムでMathMLをサポートするにはどうすればよいですか?

私の知る限り、MathMLはマークアップ言語です。WindowsAPIではありません。「プログラムでHTMLをサポートするにはどうすればよいですか?」と言うようなものです。HTMLはテキストであり、どこにでも貼り付けることができます。

MathMLを「サポート」しない限り、MathPadは貼り付けを拒否しますか?


アップデート

[挿入IDataObject]をクリックした後にクリップボードを調べると、2つの形式が利用可能であることがわかります(どちらもテキストではないため、マークアップが表示されない理由を説明しています)。

フォーマット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でまだ何も見つかりません。

4

3 に答える 3

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を押そうとしていることを認識する必要があります。次に、内容を抽出する必要があります。

まず、3つのクリップボード形式を登録します。

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

注: W3CのMathematical Markup Language(MathML)バージョン3.0の付録Bには、登録するWindowsクリップボード形式の名前が記載されています。

  • 一般的なMathMLWindowsクリップボード名:MathML
  • プレゼンテーションMathMLWindowsクリップボード名:MathML Presentation
  • コンテンツMathMLWindowsクリップボード名: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では、MathInputCOMオブジェクトをプログラムすることもできます。

//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、コールバックオブジェクトへの参照を与える方法です。

これは、C#からは実行できないConnectionPointContainer, andAdvise`含む非常に秘密の複雑なCOMコードです。

しかし、あなたはそうする必要はありません、あなたはただ使うことができますCtrl+V

于 2012-02-20T20:36:17.547 に答える
1

正式には「数学入力パネル」(MIP)と呼ばれていると思います。MathType製品はそれをサポートし、それを実行するためのメニュー項目を提供します。ここで言及されている他の返信のように、MIPの[挿入]ボタンをクリックすると、その下のウィンドウにCtrl-Vが送信されます。そのウィンドウがそのキーボードショートカットをサポートし、MathMLを処理する場合、それは機能します。

MathMLクリップボード形式は貼り付けでMathML入力を処理するための推奨される方法ですが、アプリでMathMLサポートを実装している場合は、CF_UNICODETEXTとして提供されるMathMLテキストも受け入れる必要があります。一部のアプリはMathMLのクリップボードへのコピーをサポートしていますが、MathMLクリップボード形式については知らないようです。もちろん、貼り付けコードは、通常の非MathMLテキストではなく、MathMLを識別するためにテキストをスニッフィングする必要があります。貼り付けだけでなく、ドラッグアンドドロップも受け入れることを検討する必要があります。

数学入力制御は、関連していますが、MIPの構成が少し異なります。私の記憶が正しければ、MIPの歴史やその他の機能が欠けています。MathTypeでの作業を開始し、すぐに利点がないことに気付きました。それを無視して、MathMLの貼り付けとドラッグアンドドロップをサポートする必要があります。アプリにとって意味がある場合は、数学入力パネルのメニュー項目を追加します。

于 2012-02-21T20:55:16.900 に答える
0

クリップボード形式の「MathMLプレゼンテーション」には、実際にはテキストが含まれています。Windows API GetClipboardData()を使用する前に、これを試しました。

さらに、MathMLフラグメントをプレーンテキスト(CF_TEXTなど)としてクリップボードにコピーしてからWord文書に貼り付けると、プレーンテキストも取得されます。つまり、WordはそれをPresentationMathMLとして解釈しません。

Wordでこれを行うには、CF_TEXTと「MathMLプレゼンテーション」の両方としてコピーする必要があります。後者のIDを取得するには、IanBoydが提案したクリップボード形式として「MathMLPresentation」を登録してみてください。WindowsはクリップボードのフォーマットIDを返します。このIDをSetClipboardData()で使用します。

于 2012-12-29T16:34:02.733 に答える