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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0402
nerveVOICEROIDへの送信、もしくはhspextのオブジェクト操作について6解決


nerve

リンク

2017/4/2(Sun) 02:05:08|NO.78792

失礼します
現在「VOICEROID+ 結月ゆかり EX」にHSPから文字列を送信、話させようと試みています。
先駆者の方はどうやらWinAPI32とクリップボードを使用していているようで理解が追いつかなかったので
参考にしつつ、若干無理やりではありますがクリップボードを使わないhspextによるウィンドウキャプチャなどを使用することで喋らせることができました


#include "hspext.as" aplsel "VOICEROID+ 結月ゆかり EX" mes refstr if stat=1:dialog "Failed":end sdim aa aplobj "WindowsForms10.RichEdit20W.app.0.378734a" //入力フォームID if stat=1:dialog "Failed2":end aplstr "てすと" wait 1 aplkey 116 //F5キー送信、発話 wait 1 //aplobj "WindowsForms10.BUTTON.app.0.378734a" //aplobjの二回目だと認識できない? //if stat=1:dialog "Failed3":end

ところがこの状態だと文字列は追加されるのみであり、今後のことを考えると利便性に欠けます
そこでテキストボックスの中身をクリアにする方法を考えたのですが、hspextで参照した先ではobjprmのような方法はないようで
またaplkeyによる「Ctrl+AとBackspaceによる全選択消し」はどうもうまくいきませんでした
参考にさせていただいたコードを見ると、どうやらsendmsgを使用、つまりウィンドウメッセージを送信しているようですが
こちらもhspextで取得したハンドル名の取得方法がわからず、またコードをよく知らないため使えない状態です

そこで伺いたいのが
・hspextを通して取得した外部テキストボックスをクリアにする方法はあるか?
・hspextではキーボードショートカットは使えないのか?
・hspextで取得したウィンドウのハンドル名の取得方法はあるのか?
・もしかしてhspextだけでなくWin32APIでないと不可?
というところです
もしご存知の方がいらっしゃいましたら、よろしくお願いします

参考にさせていただいたページ
ttp://hsp.moe/(ここでinovia氏が配布されているものはゆかりEXでは動かないようです)
ttp://codetter.com/?p=624
ttp://yasu9780.hatenablog.com/entry/2016/01/22/122324



この記事に返信する


MillkeySoftware

リンク

2017/4/2(Sun) 08:34:15|NO.78793

最初にサンプルを書いておきます。

#include "hspext.as" title "メッセージボックステスト - HSP" a = "これはテストです。\nすべての文字を選択します。\nこれはテストです" mesbox a,640,200,1 objsize 200,30 button "全部消す",*mesdel stop *mesdel //対象のオブジェクトが存在するウィンドウを検索 aplsel "メッセージボックステスト - HSP" if stat = 1 : dialog "対象のウィンドウの検索に失敗しました。" : stop //オブジェクトの検索 aplobj "Edit" if stat = 1 : dialog "対象のオブジェクトの検索に失敗しました。" : stop //送信先を強制アクティブ aplact await 10 //※HSP の Edit クラスは、CTRL + A に対応してないので別の方法で行う。 //キー送信(メッセージボックス内 - キャレットを先頭に移動) aplkeyd 36,2 : await 2 //CTRL + Home : キー下げ aplkeyu 36,2 : await 2 //CTRL + Home : キー上げ //キー送信(メッセージボックス内 - 文字列全消し) aplkeyd 35,1 | 2 : await 2 //SHIFT + CTRL + End : キー下げ aplkeyu 35,1 | 2 : await 2 //SHIFT + CTRL + End : キー上げ aplkey 8 : await 2 //BackSpace stop

>>hspextを通して取得した外部テキストボックスをクリアにする方法はあるか?
上記サンプルのように、特定ウィンドウまで特定すれば可能。

>>hspextではキーボードショートカットは使えないのか?
送信先がショートカットに対応していないと使えない。(上記サンプルみたいに)

>>hspextで取得したウィンドウのハンドル名の取得方法はあるのか?
ハンドル名というのがわからないけど、aplsel 関係で扱えるのは、ウィンドウ名とクラス名なので、ハンドル名というのは存在しない。
(ウィンドウハンドルをハンドル名と解釈しているなら、取得する方法はない。)

>>もしかしてhspextだけでなくWin32APIでないと不可?
使えるなら WinAPI の方が断然良い。ウィンドウハンドルが基本でありそのハンドルからほぼすべてを行う為。

下記は、WinAPI に切り替える場合の関係(左: HSP / 右:WinAPI)
aplsel = FindWindow
aplobj = FindWindow
aplact = SetActiveWindow
aplkey = SendInput または keybd_event
aplkeyd = 上記 aplkey と同じ
aplkeyu = 上記 aplkey と同じ



nerve

リンク

2017/4/2(Sun) 12:08:29|NO.78802

>MillkeySoftwareさん
いろいろありがとうございます

>ハンドル名というのがわからないけど、aplsel 関係で扱えるのは、ウィンドウ名とクラス名なので、ハンドル名というのは存在しない。
>(ウィンドウハンドルをハンドル名と解釈しているなら、取得する方法はない。)
この辺は私の知識不足による誤解でした
ウィンドウハンドルハンドルの取得方法ですが、この状態からだと無理なようですね……

>送信先がショートカットに対応していないと使えない。(上記サンプルみたいに)
今一度サンプルを活用させてもらってaplkeyd/aplkeyuを用いたショートカット送信を試みてみましたが、どうも受け付けてくれませんでした
ただBackspaceキーは送信されて認識されており、また手動でのショートカットは可能なので対応はしているはずなのです
この場合何か原因が考えられたりするのでしょうか?

>使えるなら WinAPI の方が断然良い。ウィンドウハンドルが基本でありそのハンドルからほぼすべてを行う為。
その場合はウィンドウハンドルを利用するために1から書き直す必要がありますか……
少しばかり調べてみます



inovia

リンク

2017/4/2(Sun) 13:22:00|NO.78808

とりあえず、動くように書き直したつもり。
VOICEROID+ 東北きりたん EX でしか動作確認してません。
(たぶん、EXシリーズは同じ処理で動きそう…)

http://hsp.moe/download/modVoiceroidEx.hsp



nerve

リンク

2017/4/2(Sun) 14:04:58|NO.78810

>inoviaさん
修正ありがとうございます
ゆかりEXでも動作を確認しました

現在APIを手探りながらあれこれ試してみてますが、inoviaさんのソース内でテキストボックスを取得しているのはGetVoiceroidTextBoxですよね?
前述した資料と合わせるとFindWindowExAでツリー構造を辿っている形のようですが、aplobjではキーワードで一発合致などはできないのでしょうか?
FindWindowもaplselのように前部一致が効かないので、そこはhspextの便利さなのか……



inovia

リンク

2017/4/2(Sun) 15:05:50|NO.78812

>aplobjではキーワードで一発合致などはできないのでしょうか?
aplobjのようにでしょうか?

内部的にはaplselはEnumWindowsを、aplobjはEnumChildWindowsを呼び出して、
関係するすべてのウィンドウを列挙しています。
あとは、列挙中に一致する文字列があるかどうか頑張って探してるだけです。
(文字列の前方・後方・完全一致などは自分で判定ロジックを書くので好きにできる。)

http://dev.onionsoft.net/trac/openhsp/browser/trunk/plugins/win32/Hspext/appcapt.cpp
https://msdn.microsoft.com/ja-jp/library/cc410851.aspx
https://msdn.microsoft.com/ja-jp/library/cc410802.aspx

HSPでEnumWindowsやEnumChildWindowsを呼び出すには、
コールバック関数という標準では対応していない機能を使う必要があります。
ちょいと敷居が高いので今回は使用せず、FindWindowExA でツリー構造を地道に辿っています。

コールバック関数プラグイン
http://chokuto.ifdef.jp/download/#hscallbk

コールバック関数モジュール
http://hsp.tv/play/pforum.php?mode=pastwch&num=62130
http://hsp.tv/play/pforum.php?mode=pastwch&num=73509



nerve

リンク

2017/4/2(Sun) 15:44:38|NO.78814

>inoviaさん
なるほどそういう仕組みだったのですか
今のところコールバック関数というのはさっぱりですが、その部分を省略できるあたり改めてHSPの便利さがわかります

結局のところ、文字列クリアもWM_SETTEXTで同時にできるようなのでAPIに移行してみることにします
テキストボックス取得部などは半分コピペの形になってはしまいましたが……
いろいろ教えていただきありがとうございました



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