メガソフトトップサポートテキストエディタ MIFESシリーズ外部からMIFESを制御する方法

MIFES

サポート情報 アップデータ製品情報

外部からMIFESを制御する方法

概要

MIFES for Windowsを、外部のアプリケーションから制御することができます。
ユーザーが作成したシステムやプログラムと連動してテキストエディタの起動や処理が必要な場合などに有効に利用できます。


外部からMIFESを制御する方法

外部のアプリケーションからMIFESを制御したいときには、MIFESのフレームウィンドウハンドルを取得し、このウィンドウに対して適切なメッセージを SendMessage() または PostMessage() で送ります。
これらのメッセージは付属の専用ファイラからMIFES本体を制御するために設けられているもので、MIFES for Windows Ver.3.0以降で使用できます(ただし(12)と(13)はVer.6.0以降のみ)。

(1)MIFESのウィンドウハンドルの取得

(2)ディスク上のMIFESを実行する

(3)MDIモードかSDIモードかを調べる

(4)編集ウィンドウがないことを調べる

(5)アクティブな状態かどうかを調べる

(6)MIFESをフォアグラウンドにする

(7)指定の機能番号を実行させる

(8)指定のマクロコマンドを実行させる

(9)ファイルが編集中かどうかを調べる

(10)指定のファイルを開く

(11)行カットバッファ/クリップボードを介した文字列の貼り付け

(12)新規ファイルを指定のオープンモードで開く

(13)カレントの編集ウィンドウのハンドルを得る

(14)指定の行番号/バイト位置にジャンプする

※MIFESからDLLを呼び出し機能拡張ができるマクロ関数(calldll)や、文書整形DLL(REP)もあります。


(1)MIFESのウィンドウハンドルの取得

MIFESのフレームウィンドウハンドルを取得するには、FindWindow() を使用し以下のクラス名で探します。
関数値が NULL だった場合には、MIFESが起動されていないことを意味します。

hwnd_miw = FindWindow("MIFrameClass32",NULL); /* Ver.3.0〜Ver.8.0 の場合 */

なお、SDIモードの場合、同時に複数のMIFESが起動されていることがあり、この場合、上記の方法ではどのMIFESのフレームウィンドウハンドルが返されるか不定です。
特定の編集ファイル名のフレームウィンドウハンドルを得たい場合には、クラス名だけでなくウィンドウ名で探してください。
ただし、SDIウィンドウのウィンドウ名は、MIFES側の設定によりフルパス名の場合とファイル名部分のみの場合がありますので注意してください。

▲TOPへ

(2)ディスク上のMIFESを実行する

MIFESが起動されていない場合に、ディスク上のMIFESを起動するには、インストールされているMIFESの実行ファイル「MIW.EXE」のフルパス名を得て、 CreateProcess() や ShellExecuteEx() などのAPIで実行します。

正常に実行できたら、WaitForInputIdle() でMIFESの起動時の初期化が終了するのを数秒待ち、その後 FindWindow() でMIFESのフレームウィンドウハンドルを取得してください。

「MIW.EXE」のフルパス名を得る方法としては、
「MIFESのインストールを行ったユーザーにフルパス名を指定してもらう」 「ハードディスクのすべてのフォルダ上で「MIW.EXE」を探す」などの方法もありますが、 ここでは『レジストリからインストール位置を探す方法』について説明します。

「レジストリからインストール位置を探す方法」について
インストールされている「MIW.EXE」のフルパス名をレジストリから探す方法としては、「拡張子 .TXT などに関連付けされたコマンドを探す」「MIFESのプログラムフォルダ(Ver.7までのロードディレクトリ)を探す」方法もありますが、以下の方法でもフルパス名を得ることができます。

  1. MIWHOOK.EXE が設定したレジストリキーを参照する(Ver.6.0以降)
  2. インストーラが定義したアンインストール用の情報から割り出す(Ver.3.0〜Ver.6.0)
  3. インストーラが設定したアプリケーションパス名から得る方法(Ver.7.0、Ver.8.0)

以下、詳細です。

1.MIWHOOK.EXE が設定したレジストリキーを参照する方法 (Ver.6.0以降のバージョンで有効)

以下のレジストリキーの名前「HookExe」に定義された文字列が、「MIW.EXE」のフルパス名になります。
※ただし、MIWHOOK.EXE の常駐をユーザーが一度以上実行しておくことが必要条件です。

キー: HKEY_LOCAL_MACHINE\SOFTWARE\MEGASOFT\MIFES
名前: HookExe

2.インストーラが定義したアンインストール用の情報から割り出す方法(Ver.3.0〜Ver.6.0で有効)

以下に示すレジストリキーの名前「UninstallString」に定義された文字列を読み出し、この文字列の「-f」より後ろの部分のフルパス名を取り出し、さらに、そのフルパス名の最後のファイル名の部分(通常は「Uninst.isu」)を「MIW.EXE」に置き換えると、「MIW.EXE」のフルパス名になります。

【Ver.3.0の場合】

  • キー
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MIFES for Windows 3.0
  • 名前
    UninstallString

【Ver.4.0の場合】

  • キー
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MIFES for Windows NT
  • 名前
    UninstallString

【Ver.5.0の場合】

  • キー
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MIFES for Windows Ver.5.0
  • 名前
    UninstallString

【Ver.6.0の場合】

  • キー
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MIFES for Windows Ver.6.0
  • 名前
    UninstallString

例)
上記のキーの名前「UninstallString」に定義された文字列は、通常は、「C:\WINDOWS\IsUn0411.exe -fC:\Program Files\MIFES\Uninst.isu ・・・・・」のようになっています。
ここで、「-f」より後ろの部分「C:\Program Files\MIFES\Uninst.isu」を取り出し、最後のファイル名の部分「Uninst.isu」を「MIW.EXE」に置き換えたパス名「C:\Program Files\MIFES\MIW.EXE」が、「MIW.EXE」のフルパス名になります。

3.インストーラが設定したアプリケーションパス名から得る方法(Ver.7.0、Ver.8.0)

以下のレジストリキーから得ることができます。

  • キー
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\MIW.EXE
  • 名前
    (既定)

▲TOPへ

(3)MDIモードかSDIモードかを調べる

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、MDIモードかSDIモードかを調べるには、以下のようにします。

HWND hwnd_miw;
ATOM atom;

atom = (ATOM)SendMessage(hwnd_miw,WM_USER+174,3,0);
if( atom ) { /* SDIモード */
GlobalDeleteAtom(atom); /* アトムは呼び出し側で削除すること */
/* アトムの内容は「MIW.EXE」のフルパス名です */
}
else { /* MDIモード */
}

▲TOPへ

(4)編集ウィンドウがないことを調べる

MDIモードの時には、編集ウィンドウが1つも開いていない場合があります。
このような場合を検出するには、以下のようにしてMDIの子ウィンドウを探してください。

HWND hwnd_miw;
HWND hwnd_miwtxt;

hwnd_miwtxt = FindWindow("MITextClass2",NULL); /* Ver.3.0〜Ver.8.0の場合 */
if( hwnd_miwtxt == NULL ) { /* 編集中のファイルが1つもない場合 */
/* 「新規作成」機能(機能番号128)を実行させる */
PostMessage(hwnd_miw,WM_COMMAND,128,0);
}

▲TOPへ

(5)アクティブな状態かどうかを調べる

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、実行中のMIFESが現在アクティブな状態(キー操作が可能な状態)であるかどうか調べるには、以下のようにします。

HWND hwnd_miw;

if( SendMessage(hwnd_miw,WM_USER+174,4,0) ) { /* アクティブな状態にある */
}
else {  /* 非アクティブな状態にある */
}

▲TOPへ

(6)MIFESをフォアグラウンドにする

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、MIFESをフォアグラウンドにする(アイコン化されている場合には元の位置に復元する)には、以下のようにします。
なお、MIFESを制御しようとしているアプリケーション自身がフォアグラウンドでない場合には、この方法ではMIFESをフォアグラウンドにすることはできませんので、注意してください。

HWND hwnd_miw;

SetForegroundWindow(hwnd_miw);

▲TOPへ

(7)指定の機能番号を実行させる

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、実行中のMIFESに指定の機能番号を実行させるには、以下のようにします。
通常の機能番号は SendMessage() でも PostMessage() でもどちらでも問題ありませんが、一部のコマンドはすぐにリターンしないものもあるので、一般的には PostMessage() を使用してメッセージを送ってください。

HWND hwnd_miw;

PostMessage(hwnd_miw,WM_COMMAND,(WPARAM)機能番号,(LPARAM)0);

機能番号(コマンド番号と呼ぶ場合もある)は、【環境設定】−【ツールバー】タブの「メニュー選択時に詳細説明を多目的バーに表示」を有効に設定しておくと、メニューの選択時に、最下行にそのメニューコマンドの説明の最後に機能番号(【数字】)が表示されます。
その他機能番号については、【ヘルプ】の「マクロリファレンス」内、「機能番号一覧」を参照してください。
なお、カスタマイズファイル中のキーワード MIWOPTION のビット18(0x00040000)を 1 に設定すると、「キー定義一覧の出力」機能(機能番号234)において、機能種別ごとの機能番号一覧も出力するようになります。

▲TOPへ

(8)指定のマクロコマンドを実行させる

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、実行中のMIFESに指定のマクロコマンドを実行させるには、以下のようにします。
必ず PostMessage() を使用してメッセージを送ってください。

※マクロコマンド名には、非日本語文字(対応するシフトJISコードが存在しない文字)は使用できません。

HWND hwnd_miw;
ATOM atom;

atom = GlobalAddAtom("実行させたいマクロコマンド名");
PostMessage(hwnd_miw,WM_USER+176,1,(LPARAM)atom); /* アトムはMIFES側で削除する */

▲TOPへ

(9)ファイルが編集中かどうかを調べる

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、指定したファイルがMIFESで編集中かどうかを調べ、編集中ならばそのファイルに切り替えるには、以下のようにします。

※Ver.8.0でパス名に非日本語文字(対応するシフトJISコードが存在しない文字)を含む場合には、GlobalAddAtomW()でアトムを作成してください。

HWND hwnd_miw;
ATOM atom;
INT i;
BYTE pathname[260];

/* 調べたいパス名をpathname[]に入れておく */
atom = GlobalAddAtom(pathname);
i = (INT)SendMessage(hwnd_miw,WM_USER+174,0,(LPARAM)atom); /* アトムはMIFES側で削除する */
if( i >= 0 ) {  /* 既にファイルは編集中(i=ウィンドウ番号) */
/* pathname[]ファイル(ウィンドウ番号=i)に切り替える */
PostMessage(hwnd_miw,WM_USER+174,1,(LPARAM)i);
/* MIFESをフォアグラウンドにする */
SetForegroundWindow(hwnd_miw);
}
else if( i == -1 ) { /* 未オープン(オープン可能) */
}
else {      /* エラー(オープン不可能) */
}

▲TOPへ

(10)指定のファイルを開く

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、指定したファイルをMIFESで開くには、以下のようにします。

※Ver.8.0でパス名に非日本語文字(対応するシフトJISコードが存在しない文字)を含む場合には、GlobalAddAtomW()でアトムを作成してください。

HWND hwnd_miw;
ATOM atom;
BOOL result;
BYTE pathname[260];

/* 開きたいファイル名をpathname[ ]に入れておく */
atom = GlobalAddAtom(pathname);
result = (BOOL)SendMessage(hwnd_miw,WM_USER+174,2,(LPARAM)atom);
/* アトムはMIFES側で削除する */

指定したファイルが正常に開いた場合には、関数値に TRUE が返されます。
既に開かれている場合には、そのファイルのウィンドウに自動的に切り替えられます。この場合も関数後には TRUE が返されます。
それ以外の場合には、関数値に FALSE が返されます。

オプション記号を指定することもできます。ファイル名の前に半角スペースで区切って記述してください。

/R 読み出し専用で開くことを指定
/Bn オープンモードを指定
n=0:テキスト(^Zまで)、n=1:テキスト、n=2:バイナリ、デフォルトは自動設定
/Pプリプロセッサ名  プリプロセッサを指定(デフォルトは自動設定)
/P プリプロセッサなしを指定(デフォルトは自動設定)

ファイル名の中に半角スペースがある場合でも、半角ダブルクォーテーションで囲まないで指定してください。
オプション記号以外で最初に見つけた半角スペース以外の文字以降をすべて1つのファイル名と見なします。
オプション記号は必ずファイル名よりも前に(左側に)指定しなければなりません。
また、ファイル名は必ず1つだけ指定しなければなりません。複数のファイルを一度に指定することはできません。

▲TOPへ

(11)行カットバッファ/クリップボードを介した文字列の貼り付け

行カットバッファファイルは、テンポラリディレクトリ(環境変数 TEMP で指定されたディレクトリ)上の「MIWLCUT.TXT」です。

行カットバッファファイルは、Ver.8.0で非日本語文字やバイナリ文字を含む場合は、特殊な内部フォーマットで文字列のデータが記録されており、単純なシフトJISではありません。
非日本語文字(対応するシフトJISコードが存在しない文字)やバイナリ文字を含まない場合には、単純なシフトJISコードのテキストファイルで、特殊な制御コードはいっさいありません(EOFコードもコード1AHのデータと見なされます)。

行カットバッファファイルに文字列を書き込んだ後、MIFESで機能番号45(行単位貼り付け)を実行すると、行カットバッファファイルに書き込んだ文字列を、MIFESの現在のカーソル行の上に挿入することができます。
カーソル位置に挿入するのではなく、カーソル行の上に挿入する点に注意してください。

HWND hwnd_miw; /* フレームウィンドウハンドル */

PostMessage(hwnd_miw,WM_COMMAND,45,0);

同様にして、クリップボードにフォーマット「CF_TEXT」で文字列を書き込んだ後、MIFESに機能番号40(貼り付け)を実行させれば、クリップボードに書き込んだ文字列を、MIFESの現在のカーソル位置に挿入することができます。

※Ver.8.0では「CF_UNICODETEXT」で書き込むようにしてください。ただし、バイナリ文字や非日本語文字を全く含まない場合に限り、「CF_TEXT」で書き込んでも問題はありません。

この方法が、MIFESに文字列を挿入する最も一般的な方法と言えます。

HWND hwnd_miw; /* フレームウィンドウハンドル */

PostMessage(hwnd_miw,WM_COMMAND,40,0);

▲TOPへ

(12)新規ファイルを指定のオープンモードで開く

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、実行中のMIFESで新規ファイルを開く場合、機能番号128を WM_COMMAND でポストする方法がありますが、この方法では常にデフォルトのオープンモードで新規ファイルが開かれてしまいます。
オープンモードを指定して新規ファイルを開くには、以下のようにします。
ただし、この方法が使用できるのは、Ver.6.0以降の場合だけです。

HWND hwnd_miw;

/* テキスト(^Zまで)モードで新規ファイルを開く。Ver.8.0にはこのモードはありません。*/
PostMessage(hwnd_miw,WM_USER+174,5,0);

/* テキストモードで新規ファイルを開く */
PostMessage(hwnd_miw,WM_USER+174,6,0);

/* バイナリモードで新規ファイルを開く */
PostMessage(hwnd_miw,WM_USER+174,7,0);

▲TOPへ

(13)カレントの編集ウィンドウのハンドルを得る

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、カレントの編集ウィンドウ(フレームウィンドウ内の子ウィンドウ)のハンドルを得ることができます。
ただし、この方法が使用できるのは、Ver.6.0以降の場合だけです。

HWND hwnd_miw; /* フレームウィンドウハンドル */
HWND hwnd_miwtxt;/* カレントの編集ウィンドウのハンドル */

hwnd_miwtxt = (HWND)SendMessage(hwnd_miw,WM_USER+174,8,0);

カレントの編集ウィンドウが1つもない場合(MDIモードの場合にあり得る)には、NULL が返されます。
カレントの編集ウィンドウにメッセージ WM_CHAR を送れば、キー入力をエミュレートすることもできます。

▲TOPへ

(14)指定の行番号/バイト位置にジャンプする

MIFESのフレームウィンドウハンドル(hwnd_miw)を用いて、指定の行番号またはバイト位置にジャンプさせることができます。
ジャンプできたかどうか等の結果は返さないので、通常は PostMessage() でメッセージを送ってください。

PostMessage(hwnd_miw,WM_USER+190,1,(LPARAM)number); //number :行番号
PostMessage(hwnd_miw,WM_USER+190,2,(LPARAM)(bytepos-1)); //bytepos :バイト位置

なお、MIFESでファイルを開いて特定の行番号にジャンプするには、起動時のコマンドライン上に行番号を指定するのが最も簡単な方法です。

例. Ver.7.0まで: C:\Program Files\MIW7\MIW.EXE sample.txt+1250
例. Ver.8.0   : "C:\Program Files\MIW8\MIW.EXE" /+1250 sample.txt
例. Ver.9.0   : "C:\Program Files\MIFES9\MIW.EXE" /+1250 sample.txt

詳しくは、【ヘルプ】の「起動時オプション」を参照してください。

▲TOPへ


この資料の内容は予告なしに変更されることがあります。 いかなる場合でも、この資料の内容およびその運用の結果に関しては一切の責任を負いません。 この資料に記載されている会社名、製品名は、各社の登録商標または商標です。 この資料の一部または全部を無断で使用、複製することはできません。
Copyright(C) MEGASOFT Inc.

ページのトップへ戻る
スタッフが最新情報などを配信中!
MIFES公式facebookページ
MIFES公式twitter

サポート調査依頼

アップデータ