none
[VB 2010]sendmessage 問題 RRS feed

  • 問題

  • Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer<br/>
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer<br/>
    <br/>
      Const WM_CLOSE = &H10<br/>
      Const F9key = &H78<br/>
    <br/>
    <br/>
    Private Sub Buttontest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Buttontest.Click
        Dim WinTitle As String = "XXX.exe"
        Dim hWnd As Long = FindWindow(vbNullString, WinTitle)
        SendMessage(hWnd, F9key, 0, 0)       <br/>
        (SendMessage(hWnd, WM_CLOSE, 0, 0) )'替換<br/>
    End Sub
    

    hi~各位~

    在上面程式片段中~可以close,但f9沒反應,我想問是不是常數拿錯了?還是其他問題?

    但在程式中按f9,是有反應的~我想知道為什麼,求各大大幫忙~~

    2011年1月24日 下午 02:13

解答

  • 您好

    請參考

    如何使用SendMessage模拟按键?

    http://social.msdn.microsoft.com/Forums/zh-CN/vbasiczhchs/thread/5a3e7bc0-4baa-444c-bd4d-28454a4551f2

    參數請放對,放 WM_KEYDOWN = &H100 或 WM_KEYUP = &H101 與 F9key = &H78

      Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
      Private Const WM_KEYDOWN = &H100
      Private Const WM_KEYUP = &H101
      Const F9key = &H78
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each vProcess As Process In Process.GetProcessesByName("WindowsApplication3")
          SendMessage(vProcess.MainWindowHandle, WM_KEYDOWN, F9key, 0)
        Next
      End Sub
    

    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 CarbonDiarox 2011年1月27日 上午 04:32
    2011年1月24日 下午 03:19
    版主

所有回覆

  • 您好

    請參考

    如何使用SendMessage模拟按键?

    http://social.msdn.microsoft.com/Forums/zh-CN/vbasiczhchs/thread/5a3e7bc0-4baa-444c-bd4d-28454a4551f2

    參數請放對,放 WM_KEYDOWN = &H100 或 WM_KEYUP = &H101 與 F9key = &H78

      Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
      Private Const WM_KEYDOWN = &H100
      Private Const WM_KEYUP = &H101
      Const F9key = &H78
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        For Each vProcess As Process In Process.GetProcessesByName("WindowsApplication3")
          SendMessage(vProcess.MainWindowHandle, WM_KEYDOWN, F9key, 0)
        Next
      End Sub
    

    歡迎參觀我的Blog.NET菜鳥自救會
    • 已標示為解答 CarbonDiarox 2011年1月27日 上午 04:32
    2011年1月24日 下午 03:19
    版主
  • 本討論區就有很多相關討論,關鍵字:SendKeys SendMessage

    http://social.msdn.microsoft.com/Search/zh-TW?query=SendKeys%20SendMessage&refinement=112&beta=0&ac=8


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年1月25日 下午 02:00
  • HI~大大~

     

     Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer
     Private Const WM_KEYDOWN = &H100
     Private Const WM_KEYUP = &H101
     Const F9key = &H74
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     For Each vProcess As Process In 
     buttontest.text="OK"
     Process.GetProcessesByName("notepad")
     SendMessage(vProcess.MainWindowHandle, WM_KEYDOWN, F9key, 0)
     Next
     End Sub
    

    我用:   

    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

    的時候,沒反應。但buttontext.text有轉成ok,把notepad轉成iexplore也是一樣,當轉用

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Object) As Integer

    就彈出了:

    對 PInvoke 函式 'WindowsApplication2!WindowsApplication2.MAKI::SendMessage' 的呼叫已使堆疊失去平衡。這可能是因為 Managed PInvoke 簽章和 Unmanaged 目標簽章不相符。請確認 PInvoke 簽章的呼叫慣例及參數與目標 Unmanaged 簽章是否相符。

     

    請問大大要怎樣改才能讓 ie / notepad 有按下下f5的效果?

    2011年1月27日 上午 06:18
  • 
    
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindow( _
         ByVal lpClassName As String, _
         ByVal lpWindowName As String) As IntPtr
        End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function PostMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Boolean
      End Function
    
     Const F5key = &H74
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
      For Each vProcess As Process In Process.GetProcessesByName("notepad")
       PostMessage(vProcess.MainWindowHandle, WM_KEYDOWN, F5key, 0)
       PostMessage(vProcess.MainWindowHandle, WM_KEYUP, F5key, 0)
      Next
            Dim hWnd As Integer = FindWindow("Notepad", "未命名 - 記事本")
    
            PostMessage(hWnd, WM_KEYDOWN, F5key, 0)
            PostMessage(hWnd, WM_KEYUP, F5key, 0)
    
        End Sub
    

    2011年1月27日 上午 07:11
  • 剪貼程式碼時,請分清楚 VB6 還是 VBNET ,兩者程式碼不相容。

    送鍵盤訊息到視窗時,請分清楚目標視窗是 ANSI Window 還是 Unicode Window ,兩種不同。

    既有討論:搜尋 WM_IME_CHAR

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=WM_IME_CHAR


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年1月27日 上午 09:47
  • HI~

    如果要把f5 傳到 ie / game 之類的,要怎樣寫?

    2011年1月30日 下午 04:56
  •         For Each vProcess As Process In Process.GetProcessesByName("iexplore")
                PostMessage(vProcess.MainWindowHandle, WM_KEYDOWN, F5key, 0)
                PostMessage(vProcess.MainWindowHandle, WM_KEYUP, F5key, 0)
            Next
    

    您不會舉一反三,自行測試嗎...
    2011年1月31日 上午 01:10
  • 謝謝大大,我之前其實已經測試到在ie上可行,但是遊戲上卻不行,所以我想問:如果在online game上,postmessage / sendmessage 這種方法是不是不可行?

    補充:process-name沒有錯

    2011年2月1日 下午 04:18
  • 既然IE測試可以,前面為何不寫清楚呢?可能是遊戲有做保護,禁外掛機器人之類的...
    2011年2月2日 上午 01:15
  • 請問大大有沒有其他方法?

    不用send/post message,改用其他方法?

    2011年2月3日 下午 04:37
  • 請閱讀既有討論,搜尋關鍵字: 遊戲 外掛

    http://social.msdn.microsoft.com/Search/zh-TW/?Refinement=112&query=%e9%81%8a%e6%88%b2%20%e5%a4%96%e6%8e%9b


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年2月4日 上午 01:12
  • 請問各位大大,怎樣用post message對ie送出 alt +f4?

    試過:但不起作用。

        For Each vProcess As Process In Process.GetProcessesByName("iexplore")
                PostMessage(vProcess.MainWindowHandle, WM_KEYDOWN, Altkey , 0)
                PostMessage(vProcess.MainWindowHandle, WM_KEYDOWN,  F4key, 0)
                PostMessage(vProcess.MainWindowHandle, WM_KEYUP, Altkey, 0)
                PostMessage(vProcess.MainWindowHandle, WM_KEYUP, F4key, 0)

    2011年6月27日 上午 05:15
  •    For Each vProcess As Process In Process.GetProcessesByName("client")
                Buttontest.Text = vProcess.MainWindowTitle
                PostMessage(vProcess.MainWindowHandle, WM_KEYDOWN, F5key, 0)
                PostMessage(vProcess.MainWindowHandle, WM_KEYUP, F5key, 0)
       Next

    我試過運行這段程式,而且對比過MainWindowTitle也是對的,但程式沒有運行(沒有跳掉,也沒有壞掉,只是什麼都沒發生),請問有方法能在程式上按下f5(f5的const是正確的)嗎?

    2011年6月27日 上午 06:52
  • What is the const value for your F5Key?

    You can read more in the following link,
    http://www.cnblogs.com/sofire/archive/2010/06/19/1760698.html


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD

    2011年6月27日 上午 07:33
  • 2011年6月27日 上午 07:59
    版主
  • rtnValue = SendMessage(hWnd, WindowMessages.WM_CLOSE, 0, 0)   ' 傳回 0 成功
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月27日 下午 12:10
  • 看到亂開討論緒就覺得很 X


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年6月27日 下午 12:13
  • 合併討論緒。
    T.L. Cheng
    2011年7月2日 上午 07:02
    版主
  • 既然IE測試可以,前面為何不寫清楚呢?可能是遊戲有做保護,禁外掛機器人之類的...


    一般軟體不會特別做。

    遊戲軟體會特別做保護,以維持遊戲的公正性。

    本版已公告禁止討論破解他人設保護的文章,僅得討論善意程式開發。


    T.L. Cheng
    2011年7月2日 上午 07:05
    版主