●PC-Talker APIの呼び出し
とりあえず、SDKの一部を再配布する。以下からダウンロードしてほしい。
PCTKSDK.LZH
このアーカイブはPC-Talkerの開発キット(SDK)から再配布可能と明記されているもののみを抜き出したもの。
再配布可能ファイルは、以下の四つ。
PCTKBase.h
PCTKUsr.h
PCTKUsr.lib
PCTKUsr.dll
残念ながら、ドキュメントは再配布可能ではないようだ。
また、Visual Basic用SDKにも再配布に関する記述が見つからない。
(このあたりの記述によると、以前はSDK全体を再配布可能だったように見えるのだが……)
●ファイルの使用上の注意
DLLファイルはWindowsフォルダに入れること。Windows\systemフオルダには入れてはいけない(と書いてあった)。また、古いものを新しいものに上書きしないように。
LIBファイルを静的リンクしてしまうと、DLLファイルが無い環境では起動すらしないので、なるべくLIBファイルは使わずにLoadLibrary()で動的リンクすること。
あと、バージョンチェックの注意事項があるようだ。
●関数
//以下の6つは95Reader互換関数
BOOL WINAPI SoundMessage(LPCWSTR lpszString,int flags); //音声出力
BOOL WINAPI SoundStatus(void); //読み上げ状態取得
BOOL WINAPI SoundModifyMode(int on,int off); //値設定、取得
BOOL WINAPI SoundPause(BOOL sw); //音声一時停止(実際にはリセット)
BOOL WINAPI dic_regist(void); //なめらか読み辞書登録(無動作)
BOOL WINAPI dic_regist_detail(void); //詳細読み辞書登録(無動作)
//他にもヘッダファイルを覗くといくつか95reader互換用と書いた関数があるようだ
//以下は、PC-Talker初期バージョンから使える関数
BOOL PCTKStatus(void); //PC-Talkerの起動状態取得
void PCTKPRead(LPCTSTR lpszString,int priority,BOOL analyze); //文字列読み
void PCTKCGuide(LPCTSTR lpszString,DWORD mode); //文字列を1文字ずつ読む
void PCTKVReset(void); //読み上げ中の音声中断
BOOL PCTKGetVStatus(void); //音声読み上げ状態の取得
DWORD PCTKSetStatus(UINT item,LPVOID param1,LPVOID param2); //設定値変更
DWORD PCTKGetStatus(UINT item,LPVOID param1,LPVOID param2); //設定値取得
void PCTKCommand(LPCTSTR cmdstr,LPVOID param1,param2); //ショートカットコマンド実行
他の関数はバージョン依存なので省略。
引数の意味とかはヘッダファイルを見ればある程度はわかるんじゃないかな?
(なんせ、ドキュメント再配布不可なので)
●使用例1(読み上げ)
#include <windows.h>
typedef BOOL (WINAPI *tSndMsg)(LPCWSTR, int);
main(){
HINSTANCE hLib = LoadLibrary("soundp.dll");//95readerのDLL読込
if (hLib==NULL) hLib = LoadLibrary("PCTKUsr.dll");//PC-TalkerのDLL読込
if (hLib){
tSndMsg sndmsg = (tSndMsg)GetProcAddress(hLib, "SoundMessage");
if (sndmsg) sndmsg((LPCWSTR)"こんにちは", 0);
FreeLibrary(hLib);
}
}
文字列を読み上げさせるだけならこれで読み上げる。
読み上げを止める時はSoundPause()を使う。
この書き方なら、95readerでもPC-Talkerでも動くはず。
(95readerは持ってないので未確認だが)
しかも、結局ヘッダファイルもLIBファイルも使ってない。
(ていうか、PCTKUsr.hをincludeしたらBCC5.5でC言語モードでエラーになるし…)
●使用例2(設定の取得と変更)
前々回に書いた演奏ツールのようなケースで、キーボード入力を読み上げないようにする。
(この場合、95reader互換関数には該当機能が無いのでPC-Talker固有の関数を使う)
//ソース先頭(ただし#include <windows.h>の後)で以下を宣言。
#define _LOADLIBRARY_DEF_ //これを定義しとかないと宣言が有効にならない
#include <pctkusr.h> //上記エラーは修正済み
pPCTKGetStatus ptGetStatus;
pPCTKSetStatus ptSetStatus;
//プログラム起動時に以下を実行
HINSTANCE hLib = LoadLibrary("PCTKUsr.dll");
if (hLib){
ptGetStatus = (pPCTKGetStatus)GetProcAddress(hLib, "PCTKGetStatus");
ptSetStatus = (pPCTKSetStatus)GetProcAddress(hLib, "PCTKSetStatus");
}
//ウインドウプロシージャで以下を実行
static DWORD ptStatus; static BOOL focus;
switch (message) {
case WM_SETFOCUS:
focus=1;
/*現在の設定を保存*/
if (ptGetStatus) ptStatus = ptGetStatus(PS_STATUS, (LPVOID)PKDI_KEYGUIDE, NULL);
/*設定変更*/
if (ptSetStatus) ptSetStatus(PS_STATUS, (LPVOID)PKDI_KEYGUIDE, NULL);
return 0;
case WM_KILLFOCUS:
/*設定を元に戻す*/
if(ptSetStatus && focus)
ptSetStatus(PS_STATUS, (LPVOID)PKDI_KEYGUIDE, (LPVOID)ptStatus);
return 0;
//後始末
if (hLib) FreeLibrary(hLib);
とまあ、こんな感じで使うことができるようだ。
キャストがうざいのはヘッダが腐ってるせい。高知システム開発のプログラマは整数とポインタの区別がついてないようだ。
最近のコメント