一括表示

データの表示方法をご教授ください 投稿者:JA1RNR 吉田康太郎 

HAMLOGから取得したデータの表示方法をご教授いただけませんでしょうか。

私は、Microsoft Visual Basic 2008 Express Editionを勉強中のプログラミング初心者で、Windows APIの知識はありません。(Win XP Home Edition SP3を使っています。)

HamlogMs.txtにある「Turbo HAMLOG/Win とのデータのやりとりについて」のVB6版用を参考にして下記のプログラムを書きました。
(WindowsフォームのForm1に TextBox(Multiline)を一つ Buttonを四つ その他に RadioButton と CheckBox を貼り付けています。)

ここでは、Button1クリックでHamlogからデータを取得してTextBox1に表示させ、
また、Button2クリックでHamlogへデータ転送をさせようしています。

あらかじめHamlogの入力ウインドウにデータを入れておき、このプログラムを実行し、Button1をクリックしても TextBox1に表示させようとしますが、何も表示できません。

HamlogMs.txtのご説明に、「ハムログ内部では、(cbData==0)または(lpData==NULL)で呼び出された場合、呼び出し側アプリのSendMessage()の第3引数のハンドルに文字列を返送する。」とありますが、私にはこの返送された文字列を表示する方法がわかりません。お教えいただければ幸いです。

なお、Button2をクリックしたときは、TextBox1のデータは正常にHamlogに転送できました。

********************************************************************************
以下はVisual Basic 2008用のソースプログラムです。

Public Class Form1
Public Structure COPYDATASTRUCT
Public dwData As Integer
Public cbData As Integer
Public lpData As String
End Structure
------------------------------------------------------------------------------
Public Const THW_ENTER = &H10000 ' データ送信後、ENTERキーを押したのと同じ
Public Const THW_FOCUS = &H20000 ' データ送信後、編集ボックスにフォーカス
Public Const THW_SAVEBOX_ON = &H40000 ' データ保存時、確認MessageBox表示あり
Public Const THW_SAVEBOX_OFF = &H80000 ' データ保存時、確認MessageBox表示なし
Public Const THW_APPLIHWND = &H100000 ' メインウインドウのハンドルを返す
Public Const WM_COPYDATA As Integer = &H4A
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal cName As String, ByVal wName As Integer) As Integer
Public Declare Auto Function SendMessage Lib "user32" Alias "SendMessageA" _
(ByVal hwnd As Integer, ByVal wMsg As Integer, ByRef wParam As Integer, _
ByRef lParam As COPYDATASTRUCT) As Integer
Public Declare Function SetForegroundWindow Lib "user32" (ByVal wnd As Integer) As Integer

================================================================================
Hamlogデータを取得しようとしている部分です

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim Hwnd1, Hwnd2, cmmd As Integer
Dim cds As New COPYDATASTRUCT

Hwnd1 = FindWindow("TThwin", 0)

If Hwnd1 < 1 Then
Me.TextBox1.Text = "HAMLOGが起動していません"
Exit Sub
End If

cmmd = 115
cmmd = cmmd Or THW_APPLIHWND
cds.dwData = cmmd
cds.cbData = 0
cds.lpData = vbNullString

Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.TextBox1.Handle, cds)

End Sub

ここまでがうまくいかない部分です
================================================================================
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim cmmd As Integer
Dim Hwnd1 As Integer, Hwnd2 As Integer
Dim cds As New COPYDATASTRUCT
Dim cbuff As String
Dim WorkLeng, Scunt, Wcunt As Integer

If Me.RadioButton1.Checked = True Then
cmmd = 1
End If
If Me.RadioButton2.Checked = True Then
cmmd = 2
End If
If Me.RadioButton3.Checked = True Then
cmmd = 3
End If
If Me.RadioButton4.Checked = True Then
cmmd = 4
End If
If Me.RadioButton5.Checked = True Then
cmmd = 5
End If
If Me.RadioButton6.Checked = True Then
cmmd = 6
End If
If Me.RadioButton7.Checked = True Then
cmmd = 7
End If
If Me.RadioButton8.Checked = True Then
cmmd = 8
End If
If Me.RadioButton9.Checked = True Then
cmmd = 9
End If
If Me.RadioButton10.Checked = True Then
cmmd = 10
End If
If Me.RadioButton11.Checked = True Then
cmmd = 11
End If
If Me.RadioButton12.Checked = True Then
cmmd = 12
End If
If Me.RadioButton13.Checked = True Then
cmmd = 13
End If
If Me.RadioButton14.Checked = True Then
cmmd = 14
End If
If Me.RadioButton15.Checked = True Then
cmmd = 15
End If
If Me.RadioButton16.Checked = True Then
cmmd = 16
End If

If cmmd < 16 Then
If Me.TextBox1.Text = "" Then
MessageBox.Show("登録データが入力されていません。", "入力データ確認", MessageBoxButtons.OK, MessageBoxIcon.Information)
Exit Sub
End If
End If

Hwnd1 = FindWindow("TThwin", 0)

If Hwnd1 < 1 Then ' ハムログが起動していない
Me.TextBox1.Text = "HAMLOGが起動していません"
Exit Sub
End If


cbuff = TextBox1.Text


WorkLeng = Len(cbuff)

Scunt = 0
Wcunt = 0
For ch As Integer = 0 To WorkLeng - 1
If Asc(cbuff.Substring(ch, 1)) >= 0 And Asc(cbuff.Substring(ch, 1)) < 256 Then
Scunt = Scunt + 1
Else
Wcunt = Wcunt + 1
End If
Next

If cmmd <= 15 Then
cds.cbData = Scunt + (Wcunt * 2)
End If

cmmd = cmmd Or THW_FOCUS
cmmd = cmmd Or THW_ENTER
cds.dwData = cmmd
cds.lpData = (cbuff)

Hwnd2 = SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)

If Hwnd2 > 0 Then
SetForegroundWindow(Hwnd2)
If Me.CheckBox1.Checked = True Then
cmmd = 18
cmmd = cmmd Or THW_SAVEBOX_ON
cds.dwData = cmmd
SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
End If
If Me.CheckBox2.Checked = True Then
cmmd = 18
cmmd = cmmd Or THW_SAVEBOX_OFF
cds.dwData = cmmd
SendMessage(Hwnd1, WM_COPYDATA, Me.Handle, cds)
End If
End If

End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

Me.Close()

End Sub

Public Sub New()

InitializeComponent()

Me.Text = "Tes Program"
Me.Label1.Text = "データ"
Me.GroupBox1.Text = "処理を選択する"

Me.RadioButton1.Text = "CallSign"
Me.RadioButton2.Text = "QSO Date"
Me.RadioButton3.Text = "QSO Time"
Me.RadioButton4.Text = "His RST"
Me.RadioButton5.Text = "My RST"
Me.RadioButton6.Text = "Freqency(MHz)"
Me.RadioButton7.Text = "MODE"
Me.RadioButton8.Text = "JCC/JCG"
Me.RadioButton9.Text = "Grid"
Me.RadioButton10.Text = "QSL Info"
Me.RadioButton11.Text = "Name"
Me.RadioButton12.Text = "QTH"
Me.RadioButton13.Text = "Remarks1"
Me.RadioButton14.Text = "Remarks2"
Me.RadioButton15.Text = "全部のデータを送る"
Me.RadioButton16.Text = "入力ウインドウを消去する"

Me.Button1.Text = "HAMLOGから取得"
Me.Button2.Text = "HAMLOGへ送る"
Me.Button3.Text = "閉じる"
Me.Button4.Text = "データクリア"

Me.CheckBox1.Text = "登録確認画面を表示する"
Me.CheckBox2.Text = "登録確認画面を表示せず登録する"

Me.RadioButton15.Checked = True

End Sub

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click

Me.TextBox1.Clear()
If Me.RadioButton15.Checked = True Then
Me.TextBox1.Text = ControlChars.NewLine
End If
Me.TextBox1.Focus()
End Sub

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

If Me.CheckBox1.Checked = True Then
Me.CheckBox2.Checked = False
End If

End Sub

Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged

If Me.CheckBox2.Checked = True Then
Me.CheckBox1.Checked = False
End If

End Sub

End Class

*******************************************************************************

2009/07/16(Thu) 14:41:52  [No.101]


こんにちは。

> 私は、Microsoft Visual Basic 2008 Express Editionを勉強中のプログラミング初心者で、Windows APIの知識はありません。(Win XP Home Edition SP3を使っています。)

私はVB6なので肝心な部分でのお役にはたてないと思いますが
ソースを拝見した限りでは「フック」関係が無いような...。

下記にフックについての説明があります。
http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/06.html

以前、ここの「開発室」にも話題として出た事があったと思いますが
リニューアルの前だったようで現在は無くなっていますね。

WndProc などをキーワードで検索して見て下さい。

下記が良いかも知れません。
プロセス間通信(SendMessage)
受信側のコード

URLをコピペしたらサーバーエラーで投稿出来なかったので

「プロセス間通信(SendMessage)」キーワードで検索して見て下さい。

2009/07/17(Fri) 11:42:09  [No.102]


Re: データの表示方法をご教授ください 投稿者:JA1RNR 吉田康太郎 

JA2BQX 太田様
こんにちは。
早速ご助言いただきまして有り難うございます。

> 下記にフックについての説明があります。
> http://www.kab-studio.biz/Programing/Codian/DLL_Hook_SClass/06.html
>
> 以前、ここの「開発室」にも話題として出た事があったと思いますが
> リニューアルの前だったようで現在は無くなっていますね。
>
> WndProc などをキーワードで検索して見て下さい。
>
> 下記が良いかも知れません。
> プロセス間通信(SendMessage)
> 受信側のコード
>
> URLをコピペしたらサーバーエラーで投稿出来なかったので
>
> 「プロセス間通信(SendMessage)」キーワードで検索して見て下さい。

ご紹介くださいましたものを、検索して調べました。
初心者には難解なことばかりで、まだ解決には至っていません。

これから時間をかけて、勉強していきます。
有り難うございました。

2009/07/17(Fri) 15:45:57  [No.103]


Re: データの表示方法をご教授ください 投稿者:JA1RNR 吉田康太郎 

JA2BQX 太田様

私宛のメールも拝見しました。
いろいろお手数をおかけいたし有り難うございます。

メールでご紹介いただきましたサンプルプログラムなども参考にして、勉強いたします。
取り急ぎお礼まで。

2009/07/17(Fri) 16:46:05  [No.104]


こんにちは。
午前中に何回も投稿しようとしてその度にエラーだったのでメールで失礼しました。 
その後、内容を書き換えたら投稿出来ました。

私もVB6で、今回の件が分からずに苦労してJA4管内の方に教えていただいた事がありました。
上手く動作するようになると良いですね。

明日、早朝より関ハムに出かけるので留守になります。

2009/07/17(Fri) 17:23:37  [No.105]


Re: データの表示方法をご教授ください 投稿者:   《URL》  

JA1RNR/吉田さん、JA2GRC/3/大塚です

昨日、KANHAM 2009でJA2BQX/太田さんにお会いして、この開発室で、
VB2008 Ex. Ed. に関する質問が出ていることを聞きました。

もし、まだ、解決されていないのなら、以下の記事を参考にされて
ください。

私も、この3月からVB2008 Ex. Ed. を勉強し始めたばかりの初心者
ですが、同じ問題で躓きました。 VB.Netの実例は少ないので、
結構苦労しました。

今は快適に動いていますので、参考になればどうぞ。

http://hirotaka929.cocolog-nifty.com/blog/2009/06/hamlog-60a0.html
(URLは1行にして読み出してください)

前半が、Hamlogへの登録、後半がHamlogからの読み出しです。

それでは、ご健闘を!

PS: VB2008 Ex. Ed. の仲間が増えて嬉しいことです。

2009/07/19(Sun) 09:28:27  [No.106]


Re: データの表示方法をご教授ください 投稿者:JA1RNR 吉田康太郎 

JA2GRC/3/大塚さん、はじめまして。

太田さんからWndprocのご助言を、さらに大塚さんから具体的なソースを公開していただき、まことに有難うございました。
おかげさまでHamlogデータの取り込みができました。
重ねて御礼を申し上げます。

私には大変難解でした。大塚さんの作製された部分をデッドコピーさせていただき、Hamlogデータを取り込めることができました。

私は、PSK31の運用に、MixWを使っています。
MixWのログファイルは、簡単な構造ですので、Hamlogで読めるCSV形式に変換するプログラムをVB2008(2005)で作成しHamlogに結合しています。

そこで、もう少しスマートにデータのやり取りができないものかと思い今回の課題に取り掛かった次第です。

大塚さん、太田さん重ねて御礼申し上げます。

> 昨日、KANHAM 2009でJA2BQX/太田さんにお会いして、この開発室で、
> VB2008 Ex. Ed. に関する質問が出ていることを聞きました。
>
> もし、まだ、解決されていないのなら、以下の記事を参考にされて
> ください。
>

2009/07/19(Sun) 13:46:06  [No.108]


.NET ExpressEditionは無料の開発環境なので、プログラミングの
勉強には最適ですね.
私もVB.NETでTh505apiを利用するプログラミングで躓いたままに
なっていましたが、大塚さんと吉田さんのスレッドを見てまたや
る気になりました。Hi
おかげさまで、hdbからの交信データの読み出しや、入力ウィンド
ウの項目の受け渡しができるようになりました。
簡単な交信データの集計をするプログラムを作ったりしています。

吉田さん、ご健闘ください。

2009/07/19(Sun) 10:46:32  [No.107]


Re: データの表示方法をご教授ください 投稿者:JA1RNR 吉田康太郎 

JR1CPB 稲村さん、こんにちは。

はい、無料で利用できるので助かっています。
おかげさまで、太田さん、大塚さんから貴重なソースの公開をしていただき、Hamlogデータのやり取りの基本ができるようになりました。
最近は7MHzの伝搬状態がよくありませんので、少しプログラミング勉強をしたいと思い取り掛かかりました。

> .NET ExpressEditionは無料の開発環境なので、プログラミングの
> 勉強には最適ですね.
> 私もVB.NETでTh505apiを利用するプログラミングで躓いたままに
> なっていましたが、大塚さんと吉田さんのスレッドを見てまたや
> る気になりました。Hi
> おかげさまで、hdbからの交信データの読み出しや、入力ウィンド
> ウの項目の受け渡しができるようになりました。
> 簡単な交信データの集計をするプログラムを作ったりしています。
>
> 吉田さん、ご健闘ください。

2009/07/19(Sun) 13:59:03  [No.109]