HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0715
はりおSpy++?? SendMessageを使ってGomPlayerの再生を10秒進めたい9解決


はりお

リンク

2020/7/15(Wed) 11:39:18|NO.90990

お世話になります。また教えて下さい。

HSPのソフトを用いてGomPlayerを制御したいと考えて居ます。
具体的な制御内容ですが、タイトルにあるとおり、再生位置を10秒ほど進めたりしたいと
考えて居ます。
以前どなたかに教えて頂いて頂いたかと思うのですが、
確か、MSのSpy++?だったと思うのですがそれを用いてSendMessageのlparamを取得して
命令で送っていたと思います。
具体的なソースとして

#module // マルチディスプレイの ハンドルとRECT を取得 #uselib "kernel32.dll" #func VirtualProtect@_xdim "VirtualProtect" var,int,int,var #define global xdim(%1,%2) dim %1,%2: VirtualProtect@_xdim %1,%2*4,$40,AZSD@_xdim #uselib "user32.dll" #func EnumDisplayMonitors "EnumDisplayMonitors" sptr, sptr, sptr, int #deffunc GetDisplayMonitors var info dim info, 100 if ( func == 0 ) { xdim func, 14 func.0 = $10244c8b, $548b018b, $c06b0424, $04410314, $8b108956, $8b102454, $04708932 func.7 = $8904728b, $728b0870, $0c708908, $890c528b, $01ff1050, $5e40c033, $cc0010c2 } struct1 = 0, varptr(info) EnumDisplayMonitors 0, 0, varptr(func), varptr(struct1) if stat : return struct1 return -1 #global #define WM_COMMAND 0x111 // GomPlayer検索、移動用、ログファイル終了用 #uselib "user32.dll" #func global FindWindow "FindWindowExA" sptr,sptr,sptr,sptr #func global GetClassName "GetClassNameA" sptr,sptr,sptr #func SetForegroundWindow "SetForegroundWindow" sptr #func global MoveWindow "MoveWindow" sptr,sptr,sptr,sptr,sptr,sptr #func global SendMessage "SendMessageA" sptr,sptr,sptr,sptr // マルチモニターのサイズ、ID を取得 dim info, 100 dim disp,16,5 GetDisplayMonitors info : displays = stat // dim disp,16,5 // 先頭にて定義 repeat displays,1 c = (cnt-1)*5 disp(cnt,0) = cnt disp(cnt,1) = info(c+1) disp(cnt,2) = info(c+2) disp(cnt,3) = info(c+3) disp(cnt,4) = info(c+4) loop // disp(ID,1)変数を使ってソート repeat displays,1 _cnt = cnt repeat displays,1 if ( disp(_cnt,1) < disp(cnt,1) ) { tmp = disp(_cnt,0) : disp(_cnt,0) = disp(cnt,0) : disp(cnt,0) = tmp tmp = disp(_cnt,1) : disp(_cnt,1) = disp(cnt,1) : disp(cnt,1) = tmp tmp = disp(_cnt,2) : disp(_cnt,2) = disp(cnt,2) : disp(cnt,2) = tmp tmp = disp(_cnt,3) : disp(_cnt,3) = disp(cnt,3) : disp(cnt,3) = tmp tmp = disp(_cnt,4) : disp(_cnt,4) = disp(cnt,4) : disp(cnt,4) = tmp } loop loop hparent = 0 hwnd_target = 0 moniid = 2 // if ( eromode ) : moniid = 1 repeat //ウィンドウを検索 FindWindow hparent, hwnd_target, 0, 0 hwnd_target = stat if ( hwnd_target == 0 ) { // GomPlayerが起動していない場合 break } //クラス名を取得 sdim class, 1024 GetClassName hwnd_target, varptr(class), 1024 if ( instr(class,0,"GomPlayer") != -1 ) { // GomPlayerが起動している場合、指定モニターへ移動させる SendMessage hwnd_target,WM_COMMAND,32798,0 // サイズ100%に設定して移動させる MoveWindow hwnd_target,disp(moniid,1),disp(moniid,2),640,480,1 // 指定ウィンドウへ移動 SendMessage hwnd_target,WM_COMMAND,32716,0 // 全画面に設定して移動させる // GomPlayerの移動先とファイル検索システムのウィンドウが重なる場合、ファイル検索システムのウィンドウを移動させる if ( disp(moniid,1) <= ginfo_wx1 ) && ( disp(moniid,3) >= ginfo_wx1 ) && ( disp(moniid,2) <= ginfo_wy1 ) && ( disp(moniid,4) >= ginfo_wy1 ) { if ( moniid == 1 ) : moniid = 2 : else : moniid = 1 width ginfo_winx,ginfo_winy,disp(moniid,1)+(disp(moniid,3)-disp(moniid,1)-ginfo_winx)/2,disp(moniid,2)+(disp(moniid,4)-disp(moniid,2)-ginfo_winy)/2 SetForegroundWindow hwnd_target } } loop stop

このソースはマルチモニター環境において、モニターID2へGomPlayer本体を移動させるものです。

ここでお聞きしたいのが、

SendMessage hwnd_target,WM_COMMAND,32716,0 // 全画面に設定して移動させる
こちらの、lparamの数字ですが、先程書いたspy++?か何かを用いて32716という数字を探し出してきたと思うのですが、
10秒進める、遅れる、60秒進める、遅れる、300秒進める、遅れるときの数字を調べたいと思っています。この調べる方法分かる方いらっしゃいましたら教えて下さい。
よろしくお願い致します。



この記事に返信する


リンク

2020/7/15(Wed) 13:57:15|NO.90992

直接の解決方法は分からないのと、これは試してないのでもしかしたら…なのですが、
たしかGOM Playerって、左右矢印で10秒、ctrl+左右で60秒、shift+左右で00秒だったような気がします。なので、プレイヤーのウィンドウに対してキーボードイベントを送ってあげれば動くかもしれません。他のメニュー項目も将来的に制御したいとすると、この方法は場当たり的なので使えないですが、もしどうしてもだめだったら試してみてください。



リンク

2020/7/15(Wed) 13:57:57|NO.90993

失礼、shift+左右で300秒です



はりお

リンク

2020/7/15(Wed) 15:43:48|NO.90995

猫 さま

ありがとうございます。
確かにShift+→で300秒遅れたり進めることは出来ること、確認いたしました。
ただ、今回の場合、複数のGomPlayerを制御したいため、また、他の機能も増やす事も
ある為、この方法では難しいと考えて居ました。
どうしても出来ない場合はこれで回避したいと考えて居ます。
助言、ありがとうございます。



あらや

リンク

2020/7/15(Wed) 19:40:11|NO.90997

lparamではなくwParamですね^^;

細かい説明は省略しますが、
Spy++でGomPlayerのウィンドウを探します。

右クリックでメッセージを表示し
GomPlayerで再生や停止、10秒進めるなど操作してから
Spy++のメッセージ画面を確認すると

<行番号> ウィンドウハンドル S WM_COMMAND wNotifyCode:1 [アクセラレータから送信] wID:32780

という感じのメッセージが見つかると思います。
この最後のwIDの値がSendMessageで送るときのwParamの数値になります。

ちなみに32780(0x800C)は再生と一時停止のコードです。

いくつかの数値は下記のサンプルソースの定数がそのまま使えるかと思います。

#define WM_COMMAND 0x111 #define CMD_FULLSCREEN 0x7FCC // 全画面 #define CMD_STOP 0x8006 // 停止 #define CMD_BACK 0x8008 // 10秒戻る #define CMD_FORWARD 0x8009 // 10秒進む #define CMD_BACK60 0x800A // 60秒戻る #define CMD_FORWARD60 0x800B // 60秒進む #define CMD_PLAYPAUSE 0x800C // 再生&一時停止 #define CMD_ReturnStart 0x8010 // 最初から再生 #define CMD_BACK300 0x8011 // 300秒戻る #define CMD_FORWARD300 0x8012 // 300秒進む #define CMD_VOLUMEDOWN 0x8013 // 音量 ダウン #define CMD_VOLUMEUP 0x8014 // 音量 アップ #define CMD_VOLUMEMUTE 0x8016 // 音量 ミュートオン&オフ #define CMD_NEXTTRACK 0x809A // 次のトラックへ #define CMD_PREVTRACK 0x8099 // 前のトラックへ hwnd_target = 0x00000000; // GomPlayerのハンドル button gosub "Play/Pause", *gomplaypause; button gosub "Stop", *gomstop; button gosub "NextTrack", *gomnext; button gosub "PrevTrack", *gomprev; button gosub "VolUp", *gomvup; button gosub "VolDown", *gomvdown; button gosub "Mute", *gommute; button gosub "Back", *gomback; button gosub "Forward", *gomforward; button gosub "Back60", *gomback60; button gosub "Forward60", *gomforward60; button gosub "Back300", *gomback300; button gosub "Forward300", *gomforward300; stop; *gomplaypause sendmsg hwnd_target, WM_COMMAND, CMD_PLAYPAUSE, 0; return; *gomstop sendmsg hwnd_target, WM_COMMAND, CMD_STOP, 0; return; *gomnext sendmsg hwnd_target, WM_COMMAND, CMD_NEXTTRACK, 0; return; *gomprev sendmsg hwnd_target, WM_COMMAND, CMD_PREVTRACK, 0; return; *gomvup sendmsg hwnd_target, WM_COMMAND, CMD_VOLUMEUP, 0; return; *gomvdown sendmsg hwnd_target, WM_COMMAND, CMD_VOLUMEDOWN, 0; return; *gommute sendmsg hwnd_target, WM_COMMAND, CMD_VOLUMEMUTE, 0; return; *gomback sendmsg hwnd_target, WM_COMMAND, CMD_BACK, 0; return; *gomforward sendmsg hwnd_target, WM_COMMAND, CMD_FORWARD, 0; return; *gomback60 sendmsg hwnd_target, WM_COMMAND, CMD_BACK60, 0; return; *gomforward60 sendmsg hwnd_target, WM_COMMAND, CMD_FORWARD60, 0; return; *gomback300 sendmsg hwnd_target, WM_COMMAND, CMD_BACK300, 0; return; *gomforward300 sendmsg hwnd_target, WM_COMMAND, CMD_FORWARD300, 0; return;



はりお

リンク

2020/7/15(Wed) 21:47:23|NO.90999

あらや 様

サンプルありがとうございます。
求めていた動作が確認出来ました
wparamでした、すみません。

ただ、一つ、質問させて下さい。
教えて頂いた方法でspy++にて、wparamを調べてみようとしてみましたが、
WM_COMMANDが表示されることはありませんでした。
ただし、頂いたプログラムから、Forwardをクリックすると↓のように、
<00001> ハンドル S WM_COMMAND wNotifyCode:0(メニューから送信) wID:32776
と表示されました。なぜでしょう・・・

何か使い方、設定が違うのでしょうか?
spy++のバージョンが違う??
ご確認よろしくお願い致します。



あらや

リンク

2020/7/15(Wed) 22:44:15|NO.91000

どのような状況なのかわからないので何とも言えませんが。

・Spy++でちゃんと親ウィンドウを対象としているのか。

・動作を確認するときにGomPlayerで何かのファイルを開いているか。

このあたりを確認してみると良いかもしれません。

私は適当なMP3ファイルを再生しながら確認しましたが
そのときは親ウィンドウのタイトルが
『ファイル名.mp3 - Gom Player' GomPlayer1.x』
というようなタイトルになっていました。

そして表示されるメッセージの違いに関しては
>wNotifyCode:1 [アクセラレータから送信] wID:32780
>wNotifyCode:0(メニューから送信) wID:32776
上はGomPlayerをキー操作したときのメッセージ
下はマウスでプレイヤーのコントロールボタンをクリックで操作したときのメッセージ
という違いがあるようです。

私のソースを実行した場合は
下のマウスクリックと同じメッセージになるみたいですね。



あらや

リンク

2020/7/15(Wed) 22:49:30|NO.91001

追記:

Spy++はVisual Studio 2017に同梱されていたものです。



はりお

リンク

2020/7/16(Thu) 20:34:17|NO.91006

あらや 様

助言ありがとうございます。
Spy++のバージョンを上げてみました。(ver.16.00.29714)
その後、確認したところ
>・Spy++でちゃんと親ウィンドウを対象としているのか。
設定画面にて、親ウィンドウを対象とするにチェックを入れていませんでした。
それでうまく出てこなかったと思います。
また、ハンドルの後は、Sと記載されていますが、私の環境ではPと表示されていました。
これはナンだったのだろう・・・
ですが、wID:32776と表示され、必要な情報を取得出来ました。
ありがとうございました。



あらや

リンク

2020/7/17(Fri) 00:55:49|NO.91008

情報の取得おめでとうございます。

PとSの違いは
PostMessage関数からなのかSendMessage関数からなのかの違いです。
操作方法なのかGomPlayerのバージョンなども関係あるかもしれません。

P、S、s、Rの詳細な説明は公式の解説をどうぞ
https://docs.microsoft.com/ja-jp/visualstudio/debugger/message-codes?view=vs-2019



ONION software Copyright 1997-2023(c) All rights reserved.