外部アプリケーションからHAMLOGにデータを渡せることを,つい最近知りました.
そこで,
>○ Turbo HAMLOG/Win とのデータのやりとりについて(Ver5.21以上)
> WM_COPYDATA というウインドウメッセージを使って、あなたの作成するアプリケー
>ションからTurbo HAMLOG/Winの入力ウインドウに文字列を送ったり、逆に入力ウイン
>ドウの文字列を得ることができます。
ということで,サンプルプログラムをもとにVB6で作ってみました.
HAMLOGにデータを渡すsub ルーチン(渡す文字列の引数はMessage)で,
cds.dwData = 1 Or THW_ENTER Or THW_FOCUS 'コールサインに文字列を送ってデータを送信後ENTERキーを押し,フォーカスを移す。
Hwnd1 = FindWindow("TThwin", 0)
If Hwnd1 < 1 Then ' ハムログが起動していない
Exit Sub
End If
cbuff = Message ' コールサイン文字列を引数からコピー
cds.cbData = Len(Message)
cds.lpData = Message
X = SendMessage(Hwnd1, WM_COPYDATA, hwnd, cds)
データを送るのはうまくいくのですが,
フォーカス・アクティブが Hamlog(の入力ウィンドウ)に移らず,当然前面に出てきません.
いろいろネットで調べてみるとXP(以上?)では,何やら制限がありそう.
そこで,直接,
X = SetForegroundWindow(Hwnd1)
を記述してみたところ,X の値は 0,すなわち不成功でした.
さらに,おまじないをしてからでないとダメだという記述もあったのですが,もっとシンプルに,VB6の組み込みステートメントの AppActivate を使う方法がありました.
Call AppActivate("Turbo HAMLOG", 0)
引数は,タイトルバーの文字列を渡す必要があるようです.
なんと?この記述で,きちんと制御できるようになりました.
なお,サンプルプログラム中の SendMessageの引数の定義ですが,
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
lParam As Any) As Long
と,lParam の形式は,Longではなく,Anyでないとエラーになりました.
あと,サンプルプログラム中,
SendMessage(Hwnd1, WM_COPYDATA, hwnd, cds)
は,関数なので,
X = SendMessage(Hwnd1, WM_COPYDATA, hwnd, cds)
と,戻り値を変数で受けないとエラーになりました.
ちなみに,組み込んだプログラムは,HAMLOGを使い出した2年くらい前に,手書きでリストを取っていたのを電子化するのに,HAMLOGにコールサイン・メモというのがあるのも知らなかったこともあって,紙同様にタイムスタンプを付けてログファイルに記録する機能を付けたものです.
テキストボックスそのものの単純なラインエディタの結果を,エンターが押された時に,大文字変換してテキストボックスに戻し,クリップボードにコピーして,リストボックスとタイムスタンプを付けてファイルに書き出すだけの単純なプログラムです.ミスコピーやミスタイプをチェックするためです.
ハムログとのやり取りは,ALT+TABでハムログに切り替えて,ペースト,というものでした.
今回ハムログのAPIが使えることがわかって,API経由でフォーカスの移動+ペースト(+エンター/CTL+エンター)を自動化しようと思った訳です.
ということで,無事できました.
あと,Windowsの仕様なのか,CTL+Enterをテキストボックスで入力すると,KeyDownもKeyPressもKeyUpも,CTL+Enterとして渡ってしまうようですね.
私のプログラムでは,ノートパソコンのキーの位置関係から,
Enterのみだとハムログにデータを渡さない,
CTL+Enterでハムログにデータを渡してエンターを押したのと同等,
Shit+Enterでハムログにデータを渡してCTL+エンターを押したのと同等,
にしたかったのですが,どのタイミングで渡しても,CTL+Enterが働いてしまうので,仕方なくShift+Enterでエンターを押したのと同等にしています.