【HSP3】VOICEROID+ 結月ゆかりを使用してHSPからしゃべらせるサンプル。

VOICEROID+ 結月ゆかり を使用してHSPからしゃべらせるサンプル。(作り途中) VOICEROID+ 結月ゆかり が別途必要。 http://www.amazon.co.jp/gp/product/B006GGRTZ6?ie=UTF8&tag=inovia2004-22&linkCode=shr&camp=1207&creative=8411&creativeASIN=B006GGRTZ6&redirect=true&ref_=s9_simh_gw_p65_d0_g65_i2

VOICEROID+ 結月ゆかり を使用してHSPからしゃべらせるサンプル。(作り途中) VOICEROID+ 結月ゆかり が別途必要。 http://www.amazon.co.jp/gp/product/B006GGRTZ6?ie=UTF8&tag=inovia2004-22&linkCode=shr&camp=1207&creative=8411&creativeASIN=B006GGRTZ6&redirect=true&ref_=s9_simh_gw_p65_d0_g65_i2

#include "user32.as"
#include "kernel32.as"
// ↓をダウンロードして使用
// http://lldev.jp/hsp/module/clipboard_text.html
#include "modClipboardText.hsp"

#module __AttachThread__
// 別スレッド(プロセス)のウィンドウのフォーカスを取得
#defcfunc GetFocus2
	GetForegroundWindow 
	GetWindowThreadProcessId stat, 0
	ttid = stat
	GetCurrentThreadId
	ctid = stat
	AttachThreadInput ctid, ttid, 1
	GetFocus
	h = stat
	AttachThreadInput ctid, ttid, 0
return h
// 別スレッド(プロセス)のウィンドウにフォーカスを当てる
#deffunc SetFocus2 int _h
	GetWindowThreadProcessId _h, 0
	ttid = stat
	GetCurrentThreadId
	ctid = stat
	AttachThreadInput ctid, ttid, 1
	SetFocus _h
	AttachThreadInput ctid, ttid, 0
return
/*
#deffunc ShowWindow2 int h, int f
	ShowWindow h, f
return
#deffunc IsWindow2 int _h
	IsWindow h
return stat
*/
#global
#module __VOICEROID__
// ボイスロイドの起動数を調べる
#defcfunc GetRunningNumV
	h = 0 : c = 0
	repeat
		FindWindowExA 0, h, "TkTopLevel", "VOICEROID+ 結月ゆかり"
		h = stat
		if h == 0 : c = cnt : break	// 0 になるまでループ
	loop
return c
// ボイスロイドのトップのウィンドウを取得
#defcfunc GetTopWindowV
	FindWindowA "TkTopLevel", "VOICEROID+ 結月ゆかり"
return stat
// ボイスロイドのテキストボックスを取得
#deffunc GetTextBoxV
	FindWindowExA GetTopWindowV(), 0, "TkChild", 0
		hChild = stat
		FindWindowExA hChild, 0, "TkChild", 0		// その子を取得(長男)
		FindWindowExA hChild, stat, "TkChild", 0	// 2番目(次男)
		FindWindowExA hChild, stat, "TkChild", 0	// その子の3番目の兄弟を取得(三男)といった感じ
			hGrandchild = stat
		
return
// ボイスロイドのテキストボックスを全選択する
#deffunc TextAllSelectV
	sendmsg GetTopWindowV(), 0x0111/*WM_COMMAND*/, 60, 0
return
// ボイスロイドのテキストボックスにクリップボード経由で貼り付け
#deffunc TextPasteV
	sendmsg GetTopWindowV(), 0x0111/*WM_COMMAND*/, 56, 0
return
// ボイスロイドのテキストボックスの中身を消す
#deffunc TextDeleteV
	keybd_event 46, 0, 0, 0	// DEL 押し	// バックスペースなら 8
	keybd_event 46, 0, 2, 0	// DEL 離し
return
// テキストボックスに代入します(クリップボード経由)
#deffunc SetText2V str _s
	s = _s
	// 現在のフォーカスのハンドルを取得
	nowHwnd = GetFocus2()
	// フォーカスをボイスロイドに当てる
	SetFocus2 GetTopWindowV()
	// テキストをクリアします。
	TextAllSelectV
	TextDeleteV
	wait 1	// ウェイトがないと反映されない
	// クリップボードに転送
	setcbtext s
	// 貼り付け
	TextPasteV
	// フォーカスを元に戻す
	SetFocus2 nowHwnd
return
// テキストを再生します。
#deffunc PlayTextV
	FindWindowExA GetTopWindowV(), 0, "TkChild", 0
		hChild = stat
		FindWindowExA hChild, 0, "TkChild", 0		// その子を取得
		FindWindowExA hChild, stat, "TkChild", 0	// その子の2番目の兄弟を取得
			hGrandchild = stat
			FindWindowExA hGrandchild, 0, "Button", 0		// 2番目の兄弟の孫(長男)を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の2番目を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の3番目を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の4番目を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の5番目を取得
			hTarget = stat
			/*
			mes strf("0x%08X", hTarget)
			SetFocus2 hTarget
			SetForegroundWindow hTarget
			mes stat
			*/
			;PostMessageA hTarget, 0x0006/*WM_ACTIVATE*/, 1, 0
			//SendMessageA hTarget, 0x00F5/*BM_CLICK */, 0, 0
			;PostMessageA hTarget, 0x0201/*WM_LBUTTONDOWN */, 0x0001, 0x0017003D
			;PostMessageA hTarget, 0x0200/*WM_MOUSEMOVE*/, 0x0001, 0x0017003D
			;PostMessageA hTarget, 0x0203/*WM_LBUTTONUP */, 0x0000, 0x0017003D
			PostMessageA hTarget, 0x0000/*WM_NULL*/, 0x0000, 0x00000000		// これだけでも鳴るみたい。
return
#deffunc StopTextV
	FindWindowExA GetTopWindowV(), 0, "TkChild", 0
		hChild = stat
		FindWindowExA hChild, 0, "TkChild", 0		// その子を取得
		FindWindowExA hChild, stat, "TkChild", 0	// その子の2番目の兄弟を取得
			hGrandchild = stat
			FindWindowExA hGrandchild, 0, "Button", 0		// 2番目の兄弟の孫(長男)を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の2番目を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の3番目を取得
			FindWindowExA hGrandchild, stat, "Button", 0	// 2番目の兄弟の孫の4番目を取得
			hTarget = stat
			PostMessageA hTarget, 0x0000/*WM_NULL*/, 0x0000, 0x00000000		// これだけでも鳴るみたい。
return
#global

// メイン
	// 起動している場合は 1以上が返る。
	if GetRunningNumV() > 0 {
		SetFocus2 GetTopWindowV()
		SetText2V "マイクのテストテストテスト"
		PlayTextV
	}