如何讓 vb 所寫 KeyPress 事件也可用在其他應用程式?
小弟因常需要輸入數字,為避免輸入錯誤,希望語音配合
基本上我已學會 keypress 事件 及 sndPlaySound 函數
以下方式只適用於我的vb程式,但我希望能寫出可以執行之後
在大部分的應用程式,只要是按下數字,皆可攔截鍵盤數字
自動數字發音,例如在 excel 我也經常輸入大量數字
請問 vb 應如何寫?該用哪個 api函數,或方法如何 ?
如此才能一勞永逸,只要執行此一程式之後,自動於幕後發音
不需在每個應用程式都寫這麼一段程式 ? 記得花旗輸入法就有
就有類似這個功能
------------------------
Private Sub Text1_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
   Case 49 '按下一
    sndPlaySound "1.wav", SND_ASYNC Or SND_NODEFAULT
   Case 50 '按下 2 發 2 音
    sndPlaySound "2.wav", SND_ASYNC Or SND_NODEFAULT
   Case 51
    sndPlaySound "3.wav", SND_ASYNC Or SND_NODEFAULT
   Case 52
     sndPlaySound "4.wav", SND_ASYNC Or SND_NODEFAULT
   Case 53
     sndPlaySound "5.wav", SND_ASYNC Or SND_NODEFAULT
   Case 54
     sndPlaySound "6.wav", SND_ASYNC Or SND_NODEFAULT
   Case 55
     sndPlaySound "7.wav", SND_ASYNC Or SND_NODEFAULT
   Case 56
     sndPlaySound "8.wav", SND_ASYNC Or SND_NODEFAULT
   Case 57
     sndPlaySound "9.wav", SND_ASYNC Or SND_NODEFAULT
   Case 48
     sndPlaySound "0.wav", SND_ASYNC Or SND_NODEFAULT
   Case vbKeyReturn
     sndPlaySound "Confirm.wav", SND_ASYNC Or NODEFAULT
  
 End Select
創作者介紹
創作者 vbqa 的頭像
vbqa

小吳 VBQA 程式設計討論

vbqa 發表在 痞客邦 留言(13) 人氣()


留言列表 (13)

發表留言
  • 阿雨
  • 說來話長!!
    我之前有做作類似的功能-->鎖鍵盤!!
    但由於VB先天上的規格限制,以致於力有未逮.....
    縱然有Addressof亦難以回天!!因為它只能呼叫DLL(是DLL而不是Active DLL哦!)-->指標....所以只能用來配合呼叫API之用!
    好像廢話多了點...
    看一看王國榮在旗標出版的VB與API程式設計一書中第541頁-->有解!!王老師是以自己設計一個VC++的DLL來搞定!!很好用哦!!
  • Peter
  • cww站,keyboard hook
    by Peter
  • nobuhiro
  • 我會考慮寫一個ActiveX DLL,裡面包括一個class叫作xxx,然後
    提供一個method叫作
    public sub KeyPressSound(byval KeyAscii as integer)
    這方法裡的程式就是你寫的那一票select case...
    爾後要使用時,只須要這樣寫
    Private Sub Text1_KeyPress(KeyAscii As Integer)
    ...
     xxxObject.KeyPressSound KeyAscii
     ...
    end sub
    因為有KeyPress這事件程序的元件不只text box,而且你可能會在發出
    聲音前先做其他事或發出聲音之後,例如秀個動畫或拋出其他東東
    nobuhiro

  • roger
  • 謝謝阿雨
    引用王國榮所寫的 函數已可以解決
    但函數功能不是很了解
    Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If Msg = WM_USER Then
        ' Form1.List1.AddItem "wParam=" & wParam & ", lParam=" & lParam
        ' Form1.List1.ListIndex = Form1.List1.NewIndex
        ' Form1.Text1.Text = Form1.Text1.Text + Str(lParam) + vbCrLf
         Select Case lParam
            Case 5373953
            sndPlaySound "0.wav", SND_ASYNC Or SND_NODEFAULT
            Case 5177345
            sndPlaySound "1.wav", SND_ASYNC Or SND_NODEFAULT
            Case 5242881
            .........
            ..........
            sndPlaySound "9.wav", SND_ASYNC Or SND_NODEFAULT
            End Select
            
    End If
    WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
    End Function
  • roger
  • 上面這段程式有點怪異
    在大部分的程式上都可以發因無誤
    但是進入msdos 底下 和執行
    telnet 程式時,就完全不出聲音了
    i dont know why ?


  • 阿雨
  • 一樣用API即可搞定!!
    在您的程式中呼叫API巡視所有的應用程式(執行中的哦...)
    把它們的hwnd傳進您指定的程序中!
    有點麻煩!!
    試試看吧!!
  • ChrisTorng
  • 我是沒試,但 DOS 下應該是另一個虛擬機器,照理說攔不到才正常吧?真能攔得到嗎?
  • Kuon
  • TO:ChrisTorng前輩
    您說的應該是VKD~~^_^~~
    但是SDK提供的Hook本來就有對KB的~~
    也就是M$有把KB的Hook給Release出~~^_^~~
  • Kuon
  • TO:ChrisTorng前輩
    您說的應該是VKD~~^_^~~
    但是SDK提供的Hook本來就有對KB的~~
    也就是M$有把KB的Hook給Release出~~^_^~~
  • nobuhiro
  • 在VB程式中使用WndProc()/CallWindowProc()...我2年前有用過,可是後來還是作罷,記得是因為Debug/設中斷點時會容易導致程式當掉!
    nobuhiro
  • ChrisTorng
  • 我在 WM_DESTROY 訊息中將自己的訊息程序解除,可以減少超過一半的當機問題。
  • Kuon
  • 有Hook..當然要有UnHook~~呵呵~~
  • ChrisTorng
  • 一般(包括王國榮)都是在 Form_Unload 中解除,我發現在 WM_DESTROY 中解除的話,在中斷停止時一樣會執行到此,因此比 Form_Unload 的作法要強固。