HAMLOG プログラム開発室


新着表示
タイトル
記事No
投稿日
投稿者

XP sp4上の SetForegroundWindow と THW_ENTER
395
2014/02/08(Sat) 20:16:43
JP7CZE 川辺
外部アプリケーションから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でエンターを押したのと同等にしています.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
393
2014/02/08(Sat) 19:26:11
JP7CZE 川辺
浜田さん,

> アイディアを有難うございました。

速いですね,もう表示できるようになったんですね.
せわしないオペレート中に使う機能ではないですが,
やはりボタンを押してダイアログを開くより,気が楽です.

ありがとうございました.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
392
2014/02/08(Sat) 19:18:36
JP7CZE 川辺
浜田さん,こんばんは.

> プリンタ情報は、Win32-APIの、DEVMODE構造体の内容を読みだすと、
> 取得することができます。(ということを先日知りました。)

私は,VB3で書いた80万件くらいのデータを座標の中にプロットするプログラムを10年位前にVB6に移植した時,ドローソフトに読み込ませるのに,以前はDXFかPSで時前で出力していたのを,PDFプリンタに出力するようにした時,とりあえず出来るようにやっただけなので...m(__)m

> 構造体メンバーの大半は数値で、また、プリンタ固有の設定方法があり
> ますので、文字列で保存されているプリンタ名、用紙名をバルーンヒント
> で表示させようと思います。
> アイディアを有難うございました。

了解です.参考にさせてもらいます.
ありがとうございました.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
391
2014/02/08(Sat) 10:10:36
JG1MOU浜田
JP7CZE 川辺さん、こんにちは。

> ついでながら,印刷ダイアログにはStatusBarが無いので,[プリンタ設定]ボタンのMouseMoveのときに,バルーンで”プリンタ名,用紙サイズ,トレイ”が表示されれば有難いです.

プリンタ情報は、Win32-APIの、DEVMODE構造体の内容を読みだすと、
取得することができます。(ということを先日知りました。)

構造体メンバーの大半は数値で、また、プリンタ固有の設定方法があり
ますので、文字列で保存されているプリンタ名、用紙名をバルーンヒント
で表示させようと思います。
アイディアを有難うございました。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
390
2014/02/08(Sat) 00:16:45
JP7CZE 川辺
浜田さん,お忙しい中,早速の修正ありがとうございます.

DefaultPrinter自体を書き換えてしまうと,他のプログラムに影響を与えてしまうので,リストを取得してマッチングする方法をとられたのですね.その方が行儀良いソフトで,私の方法は行儀悪い方法でした.

ついでながら,印刷ダイアログにはStatusBarが無いので,[プリンタ設定]ボタンのMouseMoveのときに,バルーンで”プリンタ名,用紙サイズ,トレイ”が表示されれば有難いです.
確認のためなら,ボタンを押してプリンタ設定ダイアログを出すまでもないということで.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
389
2014/02/03(Mon) 23:26:51
JP7CZE 川辺
浜田さん,ほんとにすばらしいソフトありがとうございます.

> 用紙サイズ設定の機能は自作できそうですが、用紙トレイ設定の
> ファンクションがよくわかりません。

 用紙,トレイについてはHamlogの既存のルーチンが使えますね。
 一時的にデフォルトプリンタを変更したあと,既存のルーチンで取得して,設定ファイルの値を設定,でできそうですね.

>JI1SAI/7からうかがっております。

現代のアマチュア無線,HamLogは新參者でして,5月でようやく3年目です.

40数年前はもちろん手書きLOGで,40数年後の世界は浦島太郎状態でした.で,現代にはHamlogという便利なログソフトがあるよということをローカルから教えていただいて,使わせてもらっています.DOS時代からの歴史のあるソフトということで(JW_CAD,秀Term,チューチューマウス,FILMTN,卓駆★,等々懐かしいですね,そういう時代には立派に存在していたわけですよね), 操作体系もWindow標準操作と合せたりする部分(仕様変更とか)もあったのでしょうね.

この前は,自動改行の件,採用していただきましてありがとうございます.あの後,Helpを見ていたら,#Text...という命令があるのを見て,
それなら,#Center とか #Rightなんかも有りかな,なんて思いました.
間に想定しているのは#Textですが,#Print, #PrintAなんかでも,Xの値が書いてあっても無視...ついでに,#Center StartX, EndX なんてパラメータも有りかとか,妄想しています.

ということで,現時点では,BBSで書かせていただいたような,ちょっと違和感を覚えつつ,活用させていただいております.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
388
2014/02/03(Mon) 22:59:49
JP7CZE 川辺
> JP7CZE川辺さん、こんばんは。 JI1SAI/7からうかがっております。
>
> 私もQSL印刷を実行したら自動給紙トレイのA4用紙でガチャガチャ
> 印刷が始まってしまい、給紙トレイごと引っこ抜いて強制中断させる
> ことがよくあります。Hi

で,あわてて止めて,印刷マークを元に戻して...コールサインでソートして印刷させているので,印刷済みのを範囲の中から目で追わないとダメなんですよね(^^;

> 私の開発ソフト(Delphi 3.1)では、プリンタの用紙サイズ取得は、
> 内部でWin32-APIのGetDeviceCaps()を呼び出しているだけのようで、
> 取得するだけのプロパティです。

Win32-APIで,たぶんこういうのがあるんだろうと思って,検索したら,SetPrinterData, SetPrinterDataEX,これらがありました(MSDNのオフラインのHelpでも検索できるはず).
もちろん,GetPrinterData, GetPrinterDataEXもあって,
VisualBasicだと,これらの関数を構造体を経由して読み書きしているだけだと思います.

> 用紙サイズ設定の機能は自作できそうですが、用紙トレイ設定の
> ファンクションがよくわかりません。

以上は,
http://msdn.microsoft.com/ja-jp/library/cc428711.aspx
のページを見るとわかると思います.

ということで,お暇な時にでも...
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Default Printer の一時変更
387
2014/02/03(Mon) 22:12:50
JG1MOU浜田
JP7CZE川辺さん、こんばんは。 JI1SAI/7からうかがっております。

私もQSL印刷を実行したら自動給紙トレイのA4用紙でガチャガチャ
印刷が始まってしまい、給紙トレイごと引っこ抜いて強制中断させる
ことがよくあります。Hi

私の開発ソフト(Delphi 3.1)では、プリンタの用紙サイズ取得は、
内部でWin32-APIのGetDeviceCaps()を呼び出しているだけのようで、
取得するだけのプロパティです。

用紙サイズ設定の機能は自作できそうですが、用紙トレイ設定の
ファンクションがよくわかりません。
後日、ググってみます。
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Default Printer の一時変更
386
2014/02/03(Mon) 21:07:19
JP7CZE 川辺
HamLog Helpの○ Q&A に,

[Q23] Turbo HAMLOG/Winで「プリンタの設定」を変更しても、次回起動したときには元に戻ってしまうのですが。
----------------
Windows の仕様と思います。
プリンタの設定を変更し、次回起動したときもその状態を保つには、Windowsのコントロールパネルなどでプリンタの設定を変更して下さい。
-----------------
とあります.これを回避する方法として,VB6では,以下の方法が可能です.

1.設定ファイルを読み込む中に,プリンター名の項目があれば,プリンター名を HamlogDefaultPrinter とかの変数に取得する.
  また,PaperSizeも,HamlogPaperSizeとかの変数に取得する.

2.設定ファイルの内容に従ってDefaultPrinterの設定,PaperSizeをするには,
(1).まず,現在のDefaultPrinter名, PaperSize を取得し,DefaultPrinter, DefaultPaperSizeとかの変数に保存.
(2).以下の方法で,DefaultPrinterを設定
Dim X As Printer 'プリンタ構造体の変数Xを作成
For Each X In Printers
If X.DeviceName = HamlogDefaultPrinter Then '設定ファイルで設定したのとデバイス名を検索.
' 一致すれば,プリンタをシステムの通常使うプリンタに設定します。
Set Printer = X
' プリンタの検索を中止します。
Exit For
End If
Next
X.PaperSize = HamlogPaperSize '用紙サイズの設定

 これで,設定ファイルに保存しているプリンタ名と用紙サイズに設定完了です.

3 終了時に,同じ手順で,DefaultPrinter,DefaultPaperSizeに戻して,HamlogDefaultPrinterを設定ファイルに書き出す.

 と,こんな感じで不可能ではないと思います.
 実際に必要な機能かどうかといいうと・・・あったらあったで嬉しい機能かもしれません.私も何回かに1回くらい,用紙サイズの指定を忘れて,あれれ,出ない,と思うことがあって,プリンタのデータキャンセルをすることがあるので.
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop
タイトル
記事No
投稿日
投稿者

Re: Win8.1Pro 64bitとDelphi6 Personal
385
2014/01/29(Wed) 22:14:39
JG1MOU浜田
> Windowsがバージョンアップするたびに互換性にビクビクしています。開発ツールだけでなくハードウェアも古いものを大切に使いすぎていますので。

開発ツールは古ーいの使ってますが、ハードは結構新しいの使うようにしてます。
おかげで、むちゃくちゃ速く動作します。

今の開発ソフトが使えなくなったら、やばいですね。
クラスライブラリのソースコードを、最近のWindowsに対応するよう改編して使ってますので。
そうなったら、そのときどうするか考えます。

私の無線とパソコン歴です。
http://homepage2.nifty.com/mou/myhist.html
このスレッドは管理者によってロックされていますので、返信並びに編集は出来ません!
pagetop