tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルWindows音声認識のマイクボタン操作につきまして
記事No16629
投稿日: 2022/03/09(Wed) 10:49
投稿者すす
お世話になります。

検索などでいろいろ調べましたが分かりませんでしたので、ご質問致しました。

OS: Windows10 , Windows11  VB6
すべてのアプリ → Windows簡単操作 →  Windows音声認識
Windows音声認識を閉じる事はできます。

質問
Windows音声認識の、まるい中のマイクボタンをクリックして
[聞き取ります] → [オフ] →[聞き取ります]を切り替えができないかと思っています。
"?????"が分かればと思っています。推測になり、ご質問して申し訳ありません。
ご教示を願えますと幸いであります。


Option Explicit

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassNams As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hwndParent As Long, ByVal hwndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long


Private Sub Command1_Click()

                    Dim Ret As Long
                    Dim hwnd As Long
                    Dim Child_hwnd As Long
                  
                  hwnd = FindWindow("MS:SpeechTopLevel", vbNullString)
                    
                  If hwnd <> 0 Then

                      Child_hwnd = FindWindowEx(hwnd, 0, "?????", vbNullString) '推測になります。
                      
                      Ret = SendMessage(Child_hwnd, &HF5, 0, 0) 'ボタンをクリック

                      '・
                      '・
                      '・
                      Ret = SendMessage(hwnd, &H10, 0&, 0&) 'Windows音声認識を閉じる事はできます。

                   End If
End Sub

[ツリー表示へ]
タイトルRe: Windows音声認識のマイクボタン操作につきまして
記事No16630
投稿日: 2022/03/09(Wed) 14:59
投稿者魔界の仮面弁士
> すべてのアプリ → Windows簡単操作 →  Windows音声認識

手元の環境にオーディオ入力デバイスが無いため、
Windows音声認識を起動できず、試すことができません…。

そもそも、ボタンが固有のウィンドウハンドルを持っているかどうかも未確認。


以下、憶測のみで回答:

> [聞き取ります] → [オフ] →[聞き取ります]を切り替えができないかと思っています。

UI Automation 関連のクラス(System.Windows.Automation 名前空間)を使えば
InvokePattern な要素を拾えるのではないでしょうか? (未確認ですが)

あるいは MSAA 経由で accDoDefaultAction メソッドを呼べないか試してみるとか。

[ツリー表示へ]
タイトルRe^2: Windows音声認識のマイクボタン操作につきまして
記事No16631
投稿日: 2022/03/09(Wed) 15:38
投稿者すす
魔界の仮面弁士 様

ご返答を下さいまして、ありがとうございます。

>そもそも、ボタンが固有のウィンドウハンドルを持っているかどうかも未確認。
ウィンドウハンドルを持ってはいない場合も考えられる事は大変、勉強になりました。

>以下、憶測のみで回答:
> [聞き取ります] → [オフ] →[聞き取ります]を切り替えができないかと思っています。
>UI Automation 関連のクラス(System.Windows.Automation 名前空間)を使えば
>InvokePattern な要素を拾えるのではないでしょうか? (未確認ですが)
>あるいは MSAA 経由で accDoDefaultAction メソッドを呼べないか試してみるとか。
以上のことを分かる範囲で調べてみたいと思います。本当にありがとうございました。

[ツリー表示へ]
タイトルRe^3: Windows音声認識のマイクボタン操作につきまして
記事No16632
投稿日: 2022/03/10(Thu) 16:45
投稿者魔界の仮面弁士
>> そもそも、ボタンが固有のウィンドウハンドルを持っているかどうかも未確認。
> ウィンドウハンドルを持ってはいない場合も考えられる事は大変、勉強になりました。

今まで該当機能を見たことがなかったのですが、
「まるい中のマイクボタン」という表現から、矩形でないのなら
おそらくはウィンドウレスだろうな…と予想していました。

一応、マイク搭載機な Win11 があったので、ざっくり確認してみたところ、
やはり各ボタンは、ウィンドウレスコントロールのように見えます。
(ボタンが単独の子ウィンドウになっているのではなく、
 トップレベルウィンドウ上に、ボタンが直接描画されている状態)


以下、手元の環境で確認した限りでは:

(1) 起動されると "C:\Windows\Speech\Common\sapisvr.exe" が立ち上がりました。
 ただし、上記コマンドラインを単独実行しただけでは起動しませんでした。

(2) トップレベルウィンドウ "MS:SpeechTopLevel" は子ウィンドウを持ちませんでした。
 そのため、元質問の FindWindowEx の出番は無さそうに見えます。
 (座標指定で、SendInput API でマウスクリックをエミュレートすることは可能かも?)

(3) UIAutomation で辿ってみたところと、一応、各要素として
 ・外側の"ウィンドウ"
 ・ウィンドウの背景"イメージ"
 ・"マイク モード" のボタン
 ・"マイクのボリューム"表示
 ・状況表示の"ウィンドウ"
 ・閉じるの"ウィンドウ"ボタン
 ・最小化の"ウィンドウ"ボタン
 をそれぞれ拾えることは確認しました。

あるいは、右クリックすると オン/スリープ/オフの選択肢が出てくるので、
コンテキストメニューを操作する方向でも制御できるかもしれません。
(メニューのハンドルまたはオブジェクトを取得できるかどうかは別問題として)

[ツリー表示へ]
タイトルRe^4: Windows音声認識のマイクボタン操作につきまして
記事No16633
投稿日: 2022/03/10(Thu) 18:10
投稿者すす
魔界の仮面弁士 様

ご返答を下さいまして、ありがとうございます。

>(1) 起動されると "C:\Windows\Speech\Common\sapisvr.exe" が立ち上がりました。
> ただし、上記コマンドラインを単独実行しただけでは起動しませんでした。
以前、自分も同じく起動しませでした。

>(2) トップレベルウィンドウ "MS:SpeechTopLevel" は子ウィンドウを持ちませんでした。
> そのため、元質問の FindWindowEx の出番は無さそうに見えます。
はい、分かりました。子ウィンドウを持ちないことは大変参考になりました。

> (座標指定で、SendInput API でマウスクリックをエミュレートすることは可能かも?)
はい、分かりました。

>(3) UIAutomation で辿ってみたところと、一応、各要素として
> ・外側の"ウィンドウ"
> ・ウィンドウの背景"イメージ"
> ・"マイク モード" のボタン
> ・"マイクのボリューム"表示
> ・状況表示の"ウィンドウ"
> ・閉じるの"ウィンドウ"ボタン
> ・最小化の"ウィンドウ"ボタン
> をそれぞれ拾えることは確認しました。
はい、分かりました。

今はハンドルからクリック方法が分かりませんのでVB6でマウスを「まるい中のマイクボタン」
まで移動してVB6で「まるい中のマイクボタン」をクリックしています。
>あるいは、右クリックすると オン/スリープ/オフの選択肢が出てくるので、
>コンテキストメニューを操作する方向でも制御できるかもしれません。
>(メニューのハンドルまたはオブジェクトを取得できるかどうかは別問題として)
はい、右クリックするとオン/スリープ/オフの選択肢は気が付きませんでした。
ありがとうございました。オン/スリープ/オフの選択で挑戦してみます。

度重ね、ご教示して頂きまして深く感謝申し上げます。

[ツリー表示へ]
タイトルRe^5: Windows音声認識のマイクボタン操作につきまして
記事No16634
投稿日: 2022/03/10(Thu) 19:18
投稿者すす
魔界の仮面弁士 様

追加分となります。

>(2) トップレベルウィンドウ "MS:SpeechTopLevel" は子ウィンドウを持ちませんでした。
> そのため、元質問の FindWindowEx の出番は無さそうに見えます。
一番、知りたかった子ウィンドウを持ちない事が分かり大変勉強になりました。
自分なりに納得する事が出来ましたのでVB6でマウスを「まるい中のマイクボタン」まで移動してVB6でクリックします。

度重ね、ご教示して頂きまして深く感謝申し上げます。

[ツリー表示へ]
タイトルRe^4: Windows音声認識のマイクボタン操作につきまして
記事No16635
投稿日: 2022/03/10(Thu) 20:57
投稿者魔界の仮面弁士
> (1) 起動されると "C:\Windows\Speech\Common\sapisvr.exe" が立ち上がりました。
>  ただし、上記コマンドラインを単独実行しただけでは起動しませんでした。

下記で起動できました。
VB6 はインストールしていないので、Excel VBA ですが。

CreateObject("WScript.Shell").Run """%systemroot%\Speech\Common\sapisvr.exe"" -SpeechUX", vbNormalFocus

[ツリー表示へ]
タイトルRe^5: Windows音声認識のマイクボタン操作につきまして
記事No16636
投稿日: 2022/03/10(Thu) 22:17
投稿者すす
魔界の仮面弁士 様

ご返答を下さいまして、ありがとうございます。

> (1) 起動されると "C:\Windows\Speech\Common\sapisvr.exe" が立ち上がりました。
>  ただし、上記コマンドラインを単独実行しただけでは起動しませんでした。
済みませんでした。

>下記で起動できました。
>VB6 はインストールしていないので、Excel VBA ですが。
>CreateObject("WScript.Shell").Run """%systemroot%\Speech\Common\sapisvr.exe"" -SpeechUX", vbNormalFocus
はい、VB6でもVBAと同じく[Windows音声認識]が立ち上がりました。
勉強します。ありがとうございました。

[ツリー表示へ]