一括表示

Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田 

またまた、問い合わせですが、どなたか Hamlog でのQSOデータを
リアルタイムでClubLogにアップロードするソフトを作成された方はありませんか?

ClubLog の HELP にある [ How To Upload Logs Directly Into Club Log ] です。

今回もVB2010で作成中です。
eQSL.cc と HRDLOGnet への リアルタイムでアップロードは出来ています。

2020/04/02(Thu) 19:19:39  [No.891]


Re: Upload Logs Directly Into Club Log 投稿者:JA9AOB 銅子 

> またまた、問い合わせですが、どなたか Hamlog でのQSOデータを
> リアルタイムでClubLogにアップロードするソフトを作成された方はありませんか?
>
> ClubLog の HELP にある [ How To Upload Logs Directly Into Club Log ] です。

頑張っていますね。私も、ClubLog にと思っていましたがまだ実施していません。ADIFで多数のデータをアップロードするのと リアルタイムで1件毎に行う場合は異なった方法でと成っていますね。

リアルタイム用のFormの例が出ていますので、eQSL で行ったように 
POST すればよろしいのではないでしょうか。とは言いましても、私はeQSL LoTW でアップロードしていますが、ADIFファイルのアップロードなのでチョッと違う構成に成りそうです。 ファイルの場合はファイルデータを読み込んで、バイトデータに変換して送っているので、これに準じた方法で行けるとは思うのですが。とにかくやってみましょう。


<html>
<body>
<form action="https://clublog.org/realtime.php" method="post" enctype="multipart/form-data">
<label for="email">Email:</label>
<input type='text' name='email'>


<label for="password">Password:</label>
<input type='password' name='password'>


<label for="callsign">Callsign:</label>
<input type='text' name='callsign'>


<label for="api">API key:</label>
<input type='text' name='api'>


<label for="adif">ADIF record string:</label>
<textarea rows='5' cols='80' name='adif'></textarea>


<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

追加:APIキー を取得しなければいけない様です --- 気後れしてしまいますね

2020/04/04(Sat) 08:15:15  [No.892]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田 

こんにちは。
ありがとうございます。ご呈示のhtmlにデータを書き込みでやってみましたが
自動でのファイルパスの書き込みは禁止されているとかでNGでした。

JA1NLX 吉田さんに助け舟をお願いしてサンプルソースを見せてもらいました。
adifのファイル転送で四苦八苦していましたがadifデータを
"adif=" にてPOSTすればOKでした。

2020/04/04(Sat) 09:15:33  [No.893]


Re: Upload Logs Directly Into Club Log 投稿者:JA9AOB 銅子 

> こんにちは。
> ありがとうございます。ご呈示のhtmlにデータを書き込みでやってみましたが
> 自動でのファイルパスの書き込みは禁止されているとかでNGでした。
>
> JA1NLX 吉田さんに助け舟をお願いしてサンプルソースを見せてもらいました。
> adifのファイル転送で四苦八苦していましたがadifデータを
> "adif=" にてPOSTすればOKでした。

了解です。LoTWも何とかと思ったのですが、認証の件で無理でした。
結局 eQSL のみ即時アップロード他は適宜手動でアップロードで賄っています。
ではまた!!。

2020/04/04(Sat) 09:36:32  [No.894]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田 

ありがとうございます。

まだ宿題が残っていまして...。
JTDXのソースを修正して sendmaessage() でHamlogへ転送時の
JTDXのウインドウ・ハンドルが取れていません。
言語はQtなのでサンプルも少なくて。
C++のコードとは違いがあるのかも....。

2020/04/04(Sat) 10:24:15  [No.895]


Re: Upload Logs Directly Into Club Log 投稿者:JA9AOB 銅子 

> ありがとうございます。
>
> まだ宿題が残っていまして...。
> JTDXのソースを修正して sendmaessage() でHamlogへ転送時の
> JTDXのウインドウ・ハンドルが取れていません。
> 言語はQtなのでサンプルも少なくて。
> C++のコードとは違いがあるのかも....。
WinApi を使って得ます
FindWindowEx() が使えると思います。ご存じの事と思いますが、JTDX WSJT-X共にClassNameが"Qt5QWindowIcon"と成っています(spay++で調べた結果)。FindWindowExは一連のOpen中のWinが順次得られますので、どのWinか判定するには captionと申しましょうか、Winに表示されている文字で判定するしかないと思います。
hWnd を得るためでなく動いている Verを調べるために作った例を提示します C# 対応です IntPtr hWnd が該当Winハンドルです


// WSJTX JTDX が起動されているかチェックしてそのCaptionを得る
private IntPtr hWndJtdx = (IntPtr)0;
public string GetWsjtxOrJtdxCaption()

{ string sCaptionVer1_8_0 = "WSJT-X v1.";
// 1 ソフトのキャプション Ver 1.8.0-rc2 3 では稼働確認 Ver 1.9.0-rc3

string sCaptionVer1_8_1 = "JTDX v18.1";
// 2 JTDX のMein確認
string sCaptionVerJTDX = "JTDX by HF community"; // 3 JTDX Ver 18.1.0.59
string sCaptionVer2_0 = "WSJT-X v2.0"; // 4 WSJT-X Ver 2.0.0
string sCaptionVer2_1 = "WSJT-X v2.1"; // 5 WSJT-X Ver 2.1.0以降
//
IntPtr hwndParent = (IntPtr)null;
IntPtr hwndChildAfter = (IntPtr)null ;
string className = "Qt5QWindowIcon";
string windowName = (string)null;
StringBuilder title = new StringBuilder(1048);
do

{ IntPtr hWnd = Win32Apis.NativeMethods.FindWindowEx(hwndParent, hwndChildAfter, className, windowName);
hWndJtdx = hWnd;
if (hWnd == (IntPtr)0) { JtVer = 0; return ""; }
string passnae = GetExeFileName(hWnd);

Win32Apis.NativeMethods.GetWindowText(hWnd, title, 1024);
int titlelen = title.ToString().Length;
string cp = "";
if (titlelen >= sCaptionVer1_8_0.Length)

{ cp = title.ToString().Substring(0, sCaptionVer1_8_0.Length);
if (sCaptionVer1_8_0.CompareTo(cp) == 0) { JtVer = 1; break; }
}
if (titlelen >= sCaptionVer1_8_1.Length)

{ cp = title.ToString().Substring(0, sCaptionVer1_8_1.Length);
if (sCaptionVer1_8_1.CompareTo(cp) == 0) { JtVer = 2; break; }
}
if (titlelen >= sCaptionVerJTDX.Length)

{ cp = title.ToString().Substring(0, sCaptionVerJTDX.Length);
if (sCaptionVerJTDX.CompareTo(cp) == 0) { JtVer = 3; break; }
}
// sCaptionVer2_0
if (titlelen >= sCaptionVer2_0.Length)

{ cp = title.ToString().Substring(0, sCaptionVer2_0.Length);
if (sCaptionVer2_0.CompareTo(cp) == 0) { JtVer = 4; break; }
}
// Ver2.1
if (titlelen >= sCaptionVer2_1.Length)

{ cp = title.ToString().Substring(0, sCaptionVer2_1.Length);
if (sCaptionVer2_1.CompareTo(cp) == 0) { JtVer = 5; break; }
}

hwndChildAfter = hWnd;
} while (true);
return title.ToString();
}

/////
public class Win32Apis


{ internal static class NativeMethods

{ // ---------------------------------------------------------------------------------
[DllImport("User32.dll", BestFitMapping = false, ThrowOnUnmappableChar = true )]
internal static extern IntPtr FindWindowEx
( IntPtr hwndParent,
IntPtr hwndChildAfter,
[MarshalAs(UnmanagedType.LPStr)] string className,
[MarshalAs(UnmanagedType.LPStr)] string windowName);

[DllImport("user32.dll", BestFitMapping = false, ThrowOnUnmappableChar = true)]
internal static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int length);
    }
}

2020/04/04(Sat) 20:50:55  [No.896]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田 

JA9AOB 銅子さん、
ソースコードを提示して頂きありがとうございます。

現在、拙作の digi2thw に ClubLog , HRDLOGnet への自動転送を組み込んでいます。
そちらがまもなく終わるので、その後で取り組ませて頂きます。

2020/04/05(Sun) 06:10:57  [No.897]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田  《URL》  

ありがとうございます。

以前にWeb上の情報で下記の様なコードを試していました。
http://www.atmarkit.co.jp/fdotnet/dotnettips/224controls/controls.html

改めて試したらこれで JTDX のメインウインドウと LogQSO ウインドウの HWND が取れました。
JTDXの Qt 言語上で自分自身の HWND を取得する関数を見つけられなければ VB.net や C# のコードをQt用に書き換えが必要になりますね。
これもまた大変で...。 時間を掛けて努力はしてみます。

VB.net の自作ソフトでハンドルを取得しファイルに書き出して、それをJTDX側で読み込む手法も無くは無いですが。
JTDXの Qt で他アプリの起動、終了が出来る様になれば可能性もありますが。

2020/04/05(Sun) 10:29:47  [No.898]


Re: Upload Logs Directly Into Club Log 投稿者:JA9AOB 銅子 

> ありがとうございます。
>
> 以前にWeb上の情報で下記の様なコードを試していました。
> http://www.atmarkit.co.jp/fdotnet/dotnettips/224controls/controls.html
あ、すみません 自分自身のWin ハンドルを取得するのですか。稼働しているWSJT-Xのハンドルかと思いました。

2020/04/05(Sun) 16:29:30  [No.899]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田 

ありがとうございます。

> あ、すみません 自分自身のWin ハンドルを取得するのですか。稼働しているWSJT-Xのハンドルかと思いました。

はい、JTDXの中で [ Log QSO ] ウインドウが表示されたら自分自身 [ Log QSO ] ウインドウのハンドルを取得したいのです。

銅子さんのC#のソースをQtの中に書いて取得も出来るのでしょうけど長くて途中でミスでエラーを出しそうです。

関数で取得出来るのではと検索していますが有っても書き方が悪いのかエラーばかりで。
JTDXの開発チームに聞いても多忙らしく返事がありません。
JTDXのMLで広く問い合わせをしなければ答えは得られないかも。

2020/04/05(Sun) 18:12:46  [No.900]


Re: Upload Logs Directly Into Club Log 投稿者:JG1MOU浜田 

ちょっと関連して・・・

Windows10 64bitになってから、FindWindow() の動作で悩んでいます。
WM_COPYDATAの動作がおかしいのかも知れません。

HAMLOGのヘルプメニューから道の駅Get'sを立ち上げると、正常です。

道の駅Get'sで集計する際、HAMLOGにメッセージを送ってHAMLOG側は
ファイルをすべて閉じます。
そのすきに、道の駅Get'sではQSOデータを開いて集計しています。

集計が終わると、道の駅Get'sからHAMLOGにメッセージを送って
HAMLOG側はファイルをすべて開きます。

これが、HAMLOGと道の駅Get'sを別々に立ち上げるとうまくいきません。
Windows7の頃は大丈夫だったような気がするのですが・・・。

2020/04/05(Sun) 21:21:42  [No.901]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田  《URL》  

浜田さん、こんばんは。
書き込みありがとうございます。

Win10 64Bit だと何かと違うのでしょうか。

まだまだ、当分は解決しそうにありません。

2020/04/05(Sun) 21:36:39  [No.902]


Re: Upload Logs Directly Into Club Log 投稿者:JG1MOU浜田 

> Win10 64Bit だと何かと違うのでしょうか。

WM_COPYDATAですが、Windows-Vistaから仕様が変わっていたようです。

HAMLOGを管理者権限、道の駅Get'sをユーザー権限で同時に動作させた
場合、WM_COPYDATAによるプロセス間通信ができない、ということが
判明しました。

権限が逆の場合や、双方がユーザー権限、あるいは双方が管理者権限
の場合は動作しました。
また、HAMLOGのヘルプメニューに道の駅Get'sを登録しておき、起動
させると、これらにかかわらずWM_COPYDATAは動作します。

そのため、HAMLOG起動時に
ChangeWindowMessageFilter(WM_COPYDATA, 1);
を実行させてみたところ、すべて解消されました。
先ほど修正版をアップしました。

なお、このAPIはWindows-Vistaから実装された関数ですので、
Windows-XPでもHAMLOGが動作するよう、動的にインポートしました。
LoadLibrary() とGetProcAddress() です。

2020/04/14(Tue) 20:14:48  [No.911]


Hamlog 最新版 投稿者:JA2BQX 太田  《URL》  

浜田さん、色々とありがとうございます。

Hamlog は最新版に入れ替えました。

2020/04/15(Wed) 08:09:53  [No.912]


Re: Upload Logs Directly Into Club Log 投稿者:JA9AOB 銅子 

> はい、JTDXの中で [ Log QSO ] ウインドウが表示されたら自分自身 [ Log QSO ] ウインドウのハンドルを取得したいのです。
>
私はVC++なのでマイクロソフトのMFC対応ウィンドウであれば 簡単ですが 異なるのでお役に立てませんね。
VC++ 付属のspy++ でもJTDXのウィンドウはトップレベルのウィンドウの情報しか得られません。
どうしてでもと言う事であれば、Win Apiを駆使して検索するより手が無いようにも思えます。

HWND hWnd = 0;
while (hWnd = FindWindowEx(hDlg, hWnd, _TEXT("Button"), NULL))
{ TCHAR title[128];
TCHAR className[128];
GetWindowText(hWnd, title, sizeof(title) / sizeof(TCHAR));//ウインドウの文字を取得して、
GetClassName(hWnd, className, sizeof(className) / sizeof(TCHAR));
_ftprintf(fp, _TEXT("\"%s\" \"%s\" %0.8x\n"), title, className, (DWORD)hWnd);}


の様な例もあります。 内容的には、ウィンドウのテキストを順次表示するだけですが、FindWindowEx の初期設定を 前回のC#の様にすれば、JTDXの各ウィンドウが得られるはずですが。 
これで目的のウィンドウが見つける手掛かりが得られるのではないでしょうか。

2020/04/06(Mon) 10:01:57  [No.903]


Re: Upload Logs Directly Into Club Log 投稿者:JA2BQX 太田 

JA9AOB 銅子さん、ありがとうございます。

パソコンは Win10 で JTDX は 64Bit版でビルドしています。
Hamlog.hdb をバイナリーで読んで処理する自前のコードでは Hamlog.hdb へのQSOデータ書き込みは成功しています。
sendmessage() 関数を使用しての処理にトライ中です。

32Bit版は Hamlog50.h 使用でビルド出来ますので。

WinIDと言うソフトでJTDXの中で [ Log QSO ] ウインドウのハンドルを取得出来ます。

2020/04/06(Mon) 10:58:43  [No.904]