|
neptuneさん、ありがとうございます。
>どんな処理をしているかを書いた方が識者から良いアドバイスを受けられると
>思いますよ。出来るだけソース(概要でも)も。
ボタンを押したら、指定したデータの音を再生し、再生が終わったら次のデータの音を再生する...という処理を作成したいのです。(テキスト合成音です)
WndProc()で終了を監視しないと、再生が終わらないうちに次の音声を再生してしまい、マズイのです。
現在のソースは
●ボタンをクリックするほうのモジュールは
Private Sub Form_Close()
EndSubClass (Me.hWnd)
End Sub
Private Sub Form_Load()
BeginSubClass (Me.hWnd)
End Sub
Private Sub 音声再生_Click()
Dim r1 As Variant
Dim Ret As String
Dim m(10) As String
Dim bib As Integer
Dim tm As String
Dim vv As String
Dim ii As Long
'stDocName = "FTM1"
Dim speaker As Long
Ret = 音再生初期処理() ・・・Dll内関数
If 再生エラー() Then
Exit Sub
End If
Ret = 音再生処理() ・・・Dll内関数
End Sub
●サブクラス化のほうは
Public Function WndProc(ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'読み上げ終了
If lParam = -1 Then
終了フラグ = True
End If
DefaultProc = colDProc(CStr(hWnd))
WndProc = CallWindowProc(DefaultProc, hWnd, umsg, wParam, lParam)
End Function
Public Sub BeginSubClass(hWnd As Long)
Static bAlready As Boolean
Dim DefaultProc As Long
If Not bAlready Then
bAlready = True
Set colDProc = New Collection
End If
DefaultProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WndProc)
colDProc.Add DefaultProc, CStr(hWnd)
End Sub
Public Sub EndSubClass(hWnd As Long)
Dim Ret As Long
Dim DefaultProc As Long
DefaultProc = colDProc.Item(hWnd)
Ret = SetWindowLong(hWnd, GWL_WNDPROC, DefaultProc)
colDProc.Remove CStr(hWnd)
End Sub
のようにしています。
>Form_Loadでサブクラス化しているのも引っかかります。キチンと表示後、
>何らかのタイミングでサブクラスしてみたら切り分け出来るかも???
Form_Loadでサブクラス化ではなく、ボタンをクリックした時にサブクラス化も試してみたのですが、同じくWndProc()がLoopしてしまいました。
WndProc()がLoopしてしまうので、コードが間違っていると思うのですが
知識もなく、VBのサンプルに沿って書いているので、
どこが間違っているのかわかりません。
引き続き、宜しくお願いします。
|
|