none
VB6 轉VB.NET 程式碼片段的問題 RRS feed

  • 問題

  • leng = string (GetWindowTextLength(hwnd2) + 1, Chr$(0))
            GetWindowText(hwnd2, leng, Len(leng))
            RichTextBox1.Text = leng

    在VB6的版本內是這樣寫的 不過放到VB.NET內

    string (GetWindowTextLength(hwnd2) + 1, Chr$(0))   

    ' string 就跑出錯誤了 說string是類別型別  之後我上msdn 查運算式

    看到了這個東西>> Resources:這個值會儲存在 .resx 檔案中。

    所以可以直接改成這樣嗎?  Resources (GetWindowTextLength(hwnd2) + 1, Chr$(0))

    這是第一個問題?

    第二個問題

    Chr$(0)這個已經不符合VB型別字別  那要怎麼改呢?

    第三個問題

    SendMessage b, WM_SETTEXT, 0, ByVal RichTextBox2.Text

    b錯誤信息跳出 方法引數要放在括號中 要怎麼修正?

    還有 ByVal 這裡跳出必須要有運算式   要怎麼修正?



    新手上路 很多問題 多多包含 ~!!
    2011年8月8日 上午 02:15

解答

  • 1)string (GetWindowTextLength(hwnd2) + 1, Chr$(0))   

    可以改成:

    Dim str As String = New String(Chr(0), GetWindowTextLength(hwnd2) + 1)

    2) Chr$(0)可以改成Chr(0)

    3)呼叫函數時, 傳入的參數要包在小括號中

    • 已標示為解答 向恩 2011年8月11日 下午 06:56
    2011年8月9日 上午 01:37

所有回覆

  • 你要不要先買本入門書或是 VB6 升級 VB.NET 的書來看...

    VB6 和 VB.NET 語法結構有不少差異,用法也有差異,雖然看起來很像。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/studyazure
    2011年8月8日 上午 02:21
    版主
  • VBNET 與 VB6 記憶體模型不同,所有涉及結構、字串、陣列的 API 呼叫都要大改,請詳細閱讀 MSDN 以下章節:

    COM Interop (Visual Basic)

     

    也就是說所有參考型別的,在 VB6 上的用法在 VBNET 上皆不適用


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

    可以改成:

    Dim str As String = New String(Chr(0), GetWindowTextLength(hwnd2) + 1)

    2) Chr$(0)可以改成Chr(0)

    3)呼叫函數時, 傳入的參數要包在小括號中

    • 已標示為解答 向恩 2011年8月11日 下午 06:56
    2011年8月9日 上午 01:37
  • 問題已經解決了 不過大大提供了另種寫法 所以選為最佳解答 ^^
    2011年8月11日 下午 06:57
  • Imports System.Runtime.InteropServices
    Imports System.Text
    
    
    Public Class Form1
    
    
      '在.NET還是改用DllImport較好用
      '記得前面要加 Imports System.Runtime.InteropServices
      '
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function GetForegroundWindow() As IntPtr
      End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
      End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
      End Function
    
      <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 FindWindowEx(ByVal parentHandle As IntPtr, _
               ByVal childAfter As IntPtr, _
               ByVal lclassName As String, _
               ByVal windowTitle 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
    
      <DllImport("Kernel32.dll", EntryPoint:="FormatMessageW", SetLastError:=True, CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
      Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef lpSource As IntPtr, ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef lpBuffer As [String], ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer
      End Function
    
      <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
      Shared Function MessageBox(ByVal hwnd As IntPtr, ByVal t As String, ByVal caption As String, ByVal t2 As MessageBoxOptions) As MessageBoxResult
      End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
      End Function
    
      <DllImport("msvcrt.dll", CharSet:=CharSet.Ansi,
     CallingConvention:=CallingConvention.Cdecl,
     ExactSpelling:=True)> _
      Public Shared Function sprintf(ByVal TargetString As System.Text.StringBuilder,
      ByVal FormatSpecifier As String, ByVal i As Int32) As Int32
      End Function
      Private Const WM_SETTEXT = &HC
      Private Const BM_CLICK = &HF5
      
    
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
      End Sub
    
      Private Sub GroupBox1_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox1.Enter
    
      End Sub
    
      Private Sub GroupBox2_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles GroupBox2.Enter
    
      End Sub
    
    
      Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    
       
      End Sub
    
    
      
    
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim hwnd2 As IntPtr
        Dim hwnd3 As IntPtr
        'Dim leng As String
        Dim b As IntPtr
        Dim hwnd1 As IntPtr
    
    
    
    
    
        hwnd2 = FindWindowEx(0, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名  
        Dim textLength As Integer = GetWindowTextLength(hwnd2)
        If textLength > 0 Then
          Dim textBuilder As New StringBuilder(textLength)
          'Dim textBuilder As New System.Text.StringBuilder("", textLength + 1)
    
    
          Dim result As Integer = GetWindowText(hwnd2, textBuilder, textLength + 1)
          If result > 0 Then
    
            RichTextBox1.Text = textBuilder.ToString() '印出抓到的即時通帳號
            hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
               '抓出YIMInputWindow控制代碼
                'b = FindWindow("IM Input Window", textBuilder.ToString())
            b = FindWindowEx(hwnd1, 0, "YIMInputWindow", vbNullString)
    
    
    
          
    
            RichTextBox2.Text = "你好嗎?"
            MsgBox(RichTextBox2.Text)
           ***  SendMessage(b, WM_SETTEXT, 0, Val(RichTextBox2.Text))
            
            'Val(RichTextBox2.Text)
            '即時通發送按鈕
            hwnd3 = FindWindowEx(hwnd1, 0, "Button", vbNullString)
    
            SendMessage(hwnd3, BM_CLICK, 0, 0)
          End If
        End If
      End Sub
     
    
    
    
      Private Sub RichTextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox2.TextChanged
        'RichTextBox2.SelectionStart = RichTextBox2.TextLength
        'RichTextBox2.ScrollToCaret()
      End Sub
    End Class
    
    


    如提 這是我撰寫的程式碼  

    程式運行到  *** SendMessage(b, WM_SETTEXT, 0, Val(RichTextBox2.Text)) 打星號這一行

    訊息無法發送出去 是我寫法哪邊有錯嗎?  請指教一下  ~~!!

    2011年8月11日 下午 07:08
  • 您可以先用偵錯工具看看b變數的內容, 如果b的內容為Nothing, 則SendMessage就會無法執行
    2011年8月12日 上午 02:21
  • 我看區域變數 b有抓到數值  不過SendMessage 沒有執行 
    2011年8月12日 上午 05:05
  • 利用 Spy++ 比對 hWnd 是否一致,也可以使用 Spy++ 撈出來的 hWnd 送訊息。

    此外也可以看看 Spy++ 裡面 GetText 的結果。

    其他參考:

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


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月12日 下午 03:03
  • 視窗的ID值   用vb6在運行的時候 我用區域變數去看他的  視窗ID值  

    跟我用VB2010 逐步執行去除錯的時候 抓到的視窗ID值一樣

    在VB2010 透過 SendMessage 要把字元送出去  卻似乎什麼東西都沒送出去

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

    這裡所有的文章  大多數的人都在討論抓按鍵的問題  我按鍵似乎抓的到 Button 我指定給SendMessage 要使用的功能 

    可是送到b的視窗的字元 卻好像什麼沒送出任何東西一樣 完全空白 是下面這個問題嗎?  我不太理解下面的東西= =


    SendMessage 是 Windows 核心中的核心,要知道是啥先要知道哪個訊息代表送字元。

    一般送字元:WM_CHAR

    模擬輸入法:WM_IME_CHAR

     

    還要確認目標視窗是否為 Unicode 視窗,來決定要送 ANSI 或 Unicode 碼。

     

    再回頭查 MSDN 。

     

     

    該填入啥,請依這兩個關鍵字查詢線上手冊。

    2011年8月12日 下午 05:27
  • ANSI Window 是 Win9x 以前,但 WinNT 支援。

    Unicode Window 是 WinNT 以後,Win9x 不支援。

    所以凡是有字串相關的 API ,都會有 A 跟 W 結尾,W 結尾的用在 Unicode Window 相關 IO 上,包含檔案等讀寫動作。

     

    另外,spy++ 有錄製訊息功能,你可以錄下來看看到底送了那些 Window Message。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月12日 下午 05:51
  • 也有可能是b不是能夠顯示字串內容的HWND, 或是b這個HWND沒有得到輸入焦點
    2011年8月13日 上午 02:35
  • 我用spy++ 去錄製訊息 沒看到半點訊息出來  我操作的步驟是 開啟spy++  按ctrl+f   然後拖移搜索工具的指標 

    到我要監看的那個即時通送話的視窗上  然後顯示選擇訊息  之後選擇確定  然後按錄製的按鈕  沒東西跑出來!!

    之後重複上面步驟 ctrl+f   然後拖移搜索工具的指標  到我設計的程式上 監看程式有沒有發出信息 然後顯示選擇訊息

     之後選擇確定  然後按錄製的按鈕  一樣沒東西跑出來!!

    是我操作錯誤嗎?  不然怎都沒有東西  我去監看之前用vb6設計出來的那支可以發送訊息的程式 也一樣監看不到任何訊息

    可是訊息確實有發送到即時通視窗上  請指教一下我操作上的錯誤 謝謝!!

    2011年8月13日 上午 06:11
  • 我有試著把b改成hwnd這個參數  一樣沒用  沒有得到輸入焦點是什麼意思?? @@
    2011年8月13日 上午 06:13
  •                 Clipboard.Clear()
                    Clipboard.SetText(RichTextBox1.Text)               
                    SendMessage(b, WM_PASTE, 0&, 0&)
    

    sendmessage的疑惑 訊息對話無法發送出去 請高手幫忙解惑一下
    • 已標示為解答 向恩 2011年8月13日 上午 08:11
    2011年8月13日 上午 07:36
  • 謝謝 joe hung 的回答  之前這篇也是我發問的 http://www.blueshop.com.tw/board/FUM200501271723350KG/BRD20110725025550ZNR.html

    在Vb6  >> SendMessage b, WM_SETTEXT, 0, ByVal Text2.Text 這段寫法是有效的

     

    而現在修改的這個  WM_SETTEXT 反而不能使用   要用 WM_PASTE 就對了吧 @@!?

     

            Clipboard.Clear()
                    Clipboard.SetText(RichTextBox1.Text)               
                    SendMessage(b, WM_PASTE, 0&, 0&)

     

     

    2011年8月13日 上午 08:25
  • ListBox1.Items.Add(Left(textBuilder, InStr(1, textBuilder, vbNullChar)))
    

    如提 插入此行代碼時  會產生錯誤訊息
    值不能為 null。
    參數名稱: item
    請問此行的代碼  該如何撰寫才是正確的呢?
    2011年8月14日 上午 07:53
  • Left、textBuilder在不知道是什麼的情況下,只能告訴您

    請確保Add的內容不能是Nothing


    Shadowと愉快なコード達
    2011年8月14日 上午 08:04
  • 在add之前,先判斷要add的值是否為空的

    if "加入的變數" <> nothing andalso "加入的變數" <> "" then
         listbox1.items.add(加入的變數)
    end if

    2011年8月14日 上午 08:20
  •  Do While hwnd5 <> 0
       Dim textLength As Integer = GetWindowTextLength(hwnd5)
       If textLength > 0 Then
        Dim textBuilder As New StringBuilder(textLength)
        'Dim textBuilder As New System.Text.StringBuilder("", textLength + 1)
        Dim result As Integer = GetWindowText(hwnd5, textBuilder, textLength + 1)
        If result > 0 Then
         'ListBox1.Text = textBuilder.ToString() '印出抓到的即時通帳號
         If Left(textBuilder, 1) <> vbNullChar Then
          ListBox1.Items.Add(Left(textBuilder, InStr(1, textBuilder, vbNullChar)))
    
    有 我在插入的時候  已經有做判斷的動作了  
    是我哪邊沒有考慮到嗎? 

     跑出這個錯誤訊息的紅線  它指標在最後一個括號 >>   )    

    值不能為 null。

    參數名稱: item   
    2011年8月14日 上午 08:27
  • 試試這樣呢?

    Do While hwnd5 <> 0
      Dim textLength As Integer = GetWindowTextLength(hwnd5)
      If textLength > 0 Then
      Dim textBuilder As New StringBuilder(textLength)
      'Dim textBuilder As New System.Text.StringBuilder("", textLength + 1)
      Dim result As Integer = GetWindowText(hwnd5, textBuilder, textLength + 1)
      If result > 0 Then
       'ListBox1.Text = textBuilder.ToString() '印出抓到的即時通帳號
       If Left(textBuilder, 1) <> vbNullChar Then
        Dim temp = Left(textBuilder, InStr(1, textBuilder, vbNullChar))
        IF temp isNot Nothing Then 
           ListBox1.Items.Add(temp)
        End IF
    
    
    

     


    Shadowと愉快なコード達
    2011年8月14日 上午 08:40
  • 我的答案跟 Shadow And Happy Code 大大一樣,Left、 textBuilder 這個有問題,監控看輸出的值
    2011年8月14日 上午 08:42
  • textBuilder  有抓到視窗的字串  不過沒有把抓到的字串 印到ListBox1中 我要做的是

    textBuilder  抓到視窗的字串 能在ListBox1印出來@@

    IF temp isNot Nothing Then 
        ListBox1.Items.Add(temp)
      End IF

    我逐步監控 看到 ListBox1.Items.Add(temp)是沒執行的 直接跳出 End IF



    2011年8月14日 上午 09:22
  • 那就直接把textBuilder塞入ListBox1不就好了嗎@@?

    Do While hwnd5 <> 0
     Dim textLength As Integer = GetWindowTextLength(hwnd5)
     If textLength > 0 Then
    
     Dim textBuilder As New StringBuilder(textLength)
     'Dim textBuilder As New System.Text.StringBuilder("", textLength + 1)
     Dim result As Integer = GetWindowText(hwnd5, textBuilder, textLength + 1)
     If result > 0 Then
     'ListBox1.Text = textBuilder.ToString() '印出抓到的即時通帳號
     ListBox1.Items.Add(textBuilder.ToString())
    
    如果要做到textBuilder不為空字串才塞進去的話
    IF textBuilder.ToString().Length >0 Then '加這個if判斷
    
     ListBox1.Items.Add(textBuilder.ToString())
    
    End IF
    

     


    Shadowと愉快なコード達



    2011年8月14日 上午 09:38
  • 恩恩  我這樣做了  可是 ListBox1 這個表單 沒有出現我要的視窗字串 是不是在ListBox1的屬性那邊 該做什麼樣的設定呢?
    2011年8月14日 上午 09:46
  • 能不能再提供更完整的程式碼?

    textBuilder有字串的話

    ListBox1.Items.Add(textBuilder.ToString())應該就會加進去


    Shadowと愉快なコード達
    2011年8月14日 上午 09:59
  • Imports System.Runtime.InteropServices
    Imports System.Text
    
    
    
    Public Class Form1
    
      Private _getWindow As IntPtr
    
      Private Property Caption As String
    
      Private Property GetWindow(ByVal hwnd5 As IntPtr, ByVal GW_HWNDNEXT As Integer) As IntPtr
        Get
          Return _getWindow
        End Get
        Set(ByVal value As IntPtr)
          _getWindow = value
        End Set
      End Property
    
    
      '在.NET還是改用DllImport較好用
      '記得前面要加 Imports System.Runtime.InteropServices
      '
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function GetForegroundWindow() As IntPtr
      End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
      End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
      End Function
    
      <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 FindWindowEx(ByVal parentHandle As IntPtr, _
               ByVal childAfter As IntPtr, _
               ByVal lclassName As String, _
               ByVal windowTitle 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
    
      <DllImport("Kernel32.dll", EntryPoint:="FormatMessageW", SetLastError:=True, CharSet:=CharSet.Auto, CallingConvention:=CallingConvention.StdCall)> _
      Public Shared Function FormatMessage(ByVal dwFlags As Integer, ByRef lpSource As IntPtr, ByVal dwMessageId As Integer, ByVal dwLanguageId As Integer, ByRef lpBuffer As [String], ByVal nSize As Integer, ByRef Arguments As IntPtr) As Integer
      End Function
    
      <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
      Shared Function MessageBox(ByVal hwnd As IntPtr, ByVal t As String, ByVal caption As String, ByVal t2 As MessageBoxOptions) As MessageBoxResult
      End Function
    
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
      End Function
    
      <DllImport("msvcrt.dll", CharSet:=CharSet.Ansi,
     CallingConvention:=CallingConvention.Cdecl,
     ExactSpelling:=True)> _
      Public Shared Function sprintf(ByVal TargetString As System.Text.StringBuilder,
      ByVal FormatSpecifier As String, ByVal i As Int32) As Int32
      End Function
      <DllImport("user32.dll", SetLastError:=False)> _
      Private Shared Function GetDesktopWindow() As IntPtr
      End Function
    
    
    
    
    
      Private Const WM_SETTEXT = &HC
      Private Const BM_CLICK = &HF5
      Private Const WM_PASTE = &H302
      Private Const GW_HWNDNEXT = 2
      
    
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
      End Sub
    
     
    
      Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim hwnd2 As IntPtr
        Dim hwnd3 As IntPtr
        'Dim leng As String
        Dim b As IntPtr
        Dim hwnd1 As IntPtr
        'Dim hwnd4 As IntPtr
        Dim lCount As Long
    
    
    
        lCount = Getyahoomessage()
    
        'hwnd4 = FindWindowEx(0, 0, "SysListView32", vbNullString)
        'hwnd2 = FindWindowEx(0, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名  
        'Dim textLength As Integer = GetWindowTextLength(hwnd2)
        'If textLength > 0 Then
        'Dim textBuilder As New StringBuilder(textLength)
        'Dim textBuilder As New System.Text.StringBuilder("", textLength + 1)
    
    
        'Dim result As Integer = GetWindowText(hwnd2, textBuilder, textLength + 1)
        'If result > 0 Then
    
        'RichTextBox1.Text = textBuilder.ToString() '印出抓到的即時通帳號
        'hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
        '抓出YIMInputWindow控制代碼
        'b = FindWindow("IM Input Window", textBuilder.ToString())
        b = FindWindowEx(hwnd1, 0, "YIMInputWindow", vbNullString)
    
        Dim s As String
        s = RichTextBox2.Text
        If s.Length > 0 Then
          'RichTextBox2.Text = "你好嗎?"
          'MsgBox(RichTextBox2.Text)
          Clipboard.Clear()
          Clipboard.SetText(s)
          SendMessage(b, WM_PASTE, 0&, 0&)
    
          'Val(RichTextBox2.Text)
          '即時通發送按鈕
          hwnd3 = FindWindowEx(hwnd1, 0, "Button", vbNullString)
    
          SendMessage(hwnd3, BM_CLICK, 0, 0)
          'End If
          'MsgBox("沒東西")
          'End If
          'End If
        End If
    
      End Sub
    
      '用來取得系統中所有打開的視窗
      Public Function Getyahoomessage() As Long
        Dim hwnd5 As IntPtr
        'Dim hwnd2 As IntPtr
        Dim ListBox1 As New ListBox()
        hwnd5 = GetDesktopWindow()
        hwnd5 = FindWindowEx(hwnd5, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名  
    
    
        '用來記錄系統中所打開的視窗的個數
        Dim lCount As Long
        lCount = 1
    
        Do While hwnd5 <> 0
          Dim textLength As Integer = GetWindowTextLength(hwnd5)
          If textLength > 0 Then
            Dim textBuilder As New StringBuilder(textLength)
            'Dim textBuilder As New System.Text.StringBuilder("", textLength + 1)
            Dim result As Integer = GetWindowText(hwnd5, textBuilder, textLength + 1)
            If result > 0 Then
    
              'If Left(textBuilder, 1) <> vbNullChar Then
              'Dim temp = Left(textBuilder, InStr(1, textBuilder, vbNullChar))
              'If temp IsNot Nothing Then
              'ListBox1.Items.Add(temp)
              'End If
              ListBox1.Items.Add(textBuilder.ToString()) '印出抓到的即時通帳號
              lCount = lCount + 1
    
            End If
          End If
    
          hwnd5 = GetWindow(hwnd5, GW_HWNDNEXT)
        Loop
        Getyahoomessage = lCount
    
    
      End Function
    
      Sub GetList()   
        ListBox1.ClearSelected()
        Dim lCount As Long
        lCount = Getyahoomessage()
        Frame1.Caption = "所有即时通視窗列表(目前總共有" & lCount & "個視窗)"
        '顯示目前活動視窗的狀態
        Dim hwnd5 As Long
        'Dim strName As String * 255
        hwnd5 = GetForegroundWindow()
        If hwnd5 = 0 Then Exit Sub
      End Sub
    
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
      End Sub
    
    
    
    
      Private Sub RichTextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox2.TextChanged
    
    
    
      End Sub
    
    
    
    
    
      
    
      Private Function Frame1() As Object
        'Throw New NotImplementedException
      End Function
    
      Private Function Left(ByVal textBuilder As StringBuilder, ByVal p2 As Integer) As String
        'Throw New NotImplementedException
      End Function
    
      Private Function InStr(ByVal p1 As Integer, ByVal textBuilder As StringBuilder, ByVal vbNullChar As String) As Integer
        'Throw New NotImplementedException
      End Function
    
      Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    
      End Sub
    
      Private Sub RichTextBox3_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RichTextBox3.TextChanged
    
      End Sub
    End Class
    
    
    這是我目前修訂的程式碼 @@
    2011年8月14日 上午 10:55
  • 若是畫面上已有ListBox1控制項,則

     Public Function Getyahoomessage() As Long
      Dim hwnd5 As IntPtr
      'Dim hwnd2 As IntPtr

      Dim ListBox1 As New ListBox() '把這行拿掉



     

    否則在該Function內

    Me.Controls.Add(ListBox1)

    Shadowと愉快なコード達

    2011年8月14日 上午 11:24
  • 感謝Shadow And Happy Code所提供的解答

    現在ListBox1已經可以印出視窗上的名稱  只不過跟我要求的功能還是有點出路

    這邊這樣打的話 會不斷的印出同一個視窗的名稱   我要求的功能不是這樣

    而是要針對 hwnd5 = GetDesktopWindow()

      hwnd5 = FindWindowEx(hwnd5, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    這個CConvWndBase視窗類名的視窗  印出所有同種類的視窗名稱  

    不曉得這邊該怎麼改  可以請Shadow And Happy Code 在指教一下嗎? 謝謝 !!

    2011年8月14日 下午 01:09
  • 不要重複使用hWnd5 造成自己及網友的混淆。

    你用 spy++ 看到 CConvWndBase 會在 DesktopWindow 下嗎?

    FindWindowEx 第二個引數 hwndChildAfter,你寫死為 0 ,不是永遠是同一個?

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月14日 下午 04:38
  • RichTextBox 是 Unicode Window ,你在 VB6 上成功是因為 VB6 是 ANSI Window ,.Net 為核心的所有程式均為 Unicode Window

    這也是上面要你看那段的原因。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月14日 下午 04:49
  • DesktopWindow  是蒐尋桌面的窗口  代表整個屏幕的窗口  所有程序的窗口都會在桌面底下

    我有用尋找視窗反覆確認過了  我尋找兩個不同標題名  相同類名CConvWndBase 的視窗  都有找到!

    至於第二個引數 這邊 我還是不太理解你的意思  我把代碼改寫成

        Dim hwnd5 As IntPtr
        Dim hwnd2 As IntPtr
        Dim hwndChildAfter As IntPtr
    
        hwnd2 = GetDesktopWindow()
        hwnd5 = FindWindowEx(hwnd2, hwndChildAfter, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    

    這樣還是不斷印出同一個標題名的窗口   麻煩在指教一下  謝謝!!

    2011年8月15日 上午 04:40

  • 如圖

     

    保護個資所以修了一下,你要的大概是這樣嗎?


    2011年8月15日 上午 06:02
  • 恩  是的   不過不用連類名都印出來

    希望能給一下修改的代碼 !!  謝謝


    2011年8月15日 上午 07:30
  • DesktopWindow  是蒐尋桌面的窗口  代表整個屏幕的窗口  所有程序的窗口都會在桌面底下

    我有用尋找視窗反覆確認過了  我尋找兩個不同標題名  相同類名CConvWndBase 的視窗  都有找到!

    你看過原型宣告及引數說明沒?

    http://msdn.microsoft.com/en-us/library/ms633500.aspx


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

     

        Dim hwndChildAfter As IntPtr
    
        'hwnd2 = GetDesktopWindow()
        hwnd5 = FindWindowEx(0, hwndChildAfter, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名  
    
    

    hwndParent [中,可選]

    類型:HWND

    句柄到父窗口的子窗口將被搜查。

    如果hwndParent是NULL,則函數使用桌面窗口的父窗口。該函數搜索中窗口的子窗口的桌面上。

    如果hwndParent是HWND_MESSAGE,功能搜索所有的消息只有Windows

    hwndChildAfter [中,可選]

    類型:HWND

    一個處理一個子窗口。搜索開始的下一個子窗口在Z順序。子窗口必須是直接子窗口hwndParent,而不僅僅是一個子窗口。

    如果hwndChildAfter為NULL,搜索開始的第一個子窗口hwndParent

    請注意,如果同時hwndParenthwndChildAfter是NULL,則函數搜索所有頂層和消息只有Windows。

     

    我參考這個  去修改我的程式代碼  上面是我修改的  還是只印出一個視窗  我理解哪邊有問題  請指教一下!!

    2011年8月15日 下午 01:17
  • 那你的迴圈在哪裡?


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月15日 下午 02:23
  •         hwnd2 = GetDesktopWindow()
    
            If hwnd2 <> 0 Then
                hwnd5 = FindWindowEx(hwnd2, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名  
    
                '用來記錄系統中所打開的視窗的個數
                Dim lCount As Long
                lCount = 1
    
                Do While hwnd5 <> IntPtr.Zero
                    Dim textLength As Integer = GetWindowTextLength(hwnd5)
                    If textLength > 0 Then
                        Dim textBuilder As New StringBuilder(textLength)
    
                        Dim result As Integer = GetWindowText(hwnd5, textBuilder, textLength + 1)
                        If result > 0 Then
    
                            If Not ListBox1.Items.Contains(textBuilder.ToString()) Then
                                ListBox1.Items.Add(textBuilder.ToString()) '印出抓到的即時通帳號
                                lCount = lCount + 1
                            End If
    
                        End If
                    End If
    
                    hwnd5 = FindWindowEx(hwnd2, hwnd5, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名  
                Loop
                Getyahoomessage = lCount
    
            End If
    

    • 已標示為解答 向恩 2011年8月15日 下午 03:45
    2011年8月15日 下午 02:52
  • 謝謝Joe Hung 提供解答的代碼  頓時豁然開朗  對FindWindowEx 有了更佳的理解 謝謝!!
    2011年8月15日 下午 03:48
  •  Public Function Getyahoomessage() As Long
     Dim hwnd5 As IntPtr
     Dim hwnd2 As IntPtr
    
    
     hwnd2 = GetDesktopWindow()
     If hwnd2 <> 0 Then
      hwnd5 = FindWindowEx(hwnd2, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    
      '用來記錄系統中所打開的視窗的個數
      Dim lCount As Long
      lCount = 0
    
      Do While hwnd5 <> IntPtr.Zero
      Dim textLength As Integer = GetWindowTextLength(hwnd5)
      If textLength > 0 Then
       Dim textBuilder As New StringBuilder(textLength)
    
       Dim result As Integer = GetWindowText(hwnd5, textBuilder, textLength + 1)
       If result > 0 Then
    
       If Not ListBox1.Items.Contains(textBuilder.ToString()) Then
        ListBox1.Items.Add(textBuilder.ToString()) '印出抓到的即時通帳號
    
    
    
       
        lCount = lCount + 1
       End If
    
       End If
      End If
    
      hwnd5 = FindWindowEx(hwnd2, hwnd5, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    
      Loop
      Getyahoomessage = lCount
    
     End If
    
     End Function
    
    
    -------------------------------------------
     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
     Dim hwnd5 As IntPtr
     Dim hwnd2 As IntPtr
     Dim lcount As Long
    
     lCount = Getyahoomessage()
     hwnd5 = FindWindowEx(hwnd2, hwnd5, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    
     End Sub
    
    ----------------------------------------------
    
     
    
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
     Dim s As String
     Dim hwnd1 As IntPtr
     Dim b As IntPtr
     'Dim lCount As Long
     Dim hwnd3 As IntPtr
     Dim hwnd5 As IntPtr
    
    
     ' ??? CALL List1_Click() 內存視窗資料過來 以發送
     Dim textLength As Integer = GetWindowTextLength(hwnd5)
     Dim textBuilder As New StringBuilder(textLength)
     hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
     b = FindWindowEx(hwnd1, 0, "YIMInputWindow", vbNullString)
     SendMessage(b, WM_SETTEXT, 0, (RichTextBox2.Text).ToString)
     s = RichTextBox2.Text
     If s.Length <> 0 Then
      hwnd3 = FindWindowEx(hwnd1, 0, "Button", vbNullString)
    
      SendMessage(hwnd3, BM_CLICK, 0, 0)
     End If
    
    
     End Sub
    
    


    目前這支程式已經可以抓到每個視窗的項目 可是要如何實現  我點選ListBox1 中的視窗項目
    獲得此項目的視窗的資料 
     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
     Dim hwnd5 As IntPtr
     Dim hwnd2 As IntPtr
     Dim lcount As Long
    
     lCount = Getyahoomessage()
     hwnd5 = FindWindowEx(hwnd2, hwnd5, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    
     End Sub
    

    我試著加入此行程式碼  再點選視窗項目的時候  可以獲得此視窗項目的資料  這個思路不曉得對不對  我這樣撰寫 如果有錯 煩請指教一下!
    假如上面的思路沒錯的話
    我現在想做的是
    <span> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
     Dim s As String
     Dim hwnd1 As IntPtr
     Dim b As IntPtr
     'Dim lCount As Long
     Dim hwnd3 As IntPtr
     Dim hwnd5 As IntPtr
    
    
     ' ??? CALL </span>ListBox1_SelectedIndexChanged 內存視窗資料過來 以發送<br/><span> Dim textLength As Integer = GetWindowTextLength(hwnd5)
     Dim textBuilder As New StringBuilder(textLength)
     hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
     b = FindWindowEx(hwnd1, 0, "YIMInputWindow", vbNullString)
     SendMessage(b, WM_SETTEXT, 0, (RichTextBox2.Text).ToString)
     s = RichTextBox2.Text
     If s.Length <> 0 Then
      hwnd3 = FindWindowEx(hwnd1, 0, "Button", vbNullString)
    
      SendMessage(hwnd3, BM_CLICK, 0, 0)
     End If
    
    
     End Sub
    </span>
    

    在我按下Button1_Click 鈕 能把ListBox1_SelectedIndexChanged的資料給CALL過來 然後針對此視窗發送
    我需要額外增加什麼項目 才能做到 我要的功能呢? 煩請各位先進指教一下 謝謝!


    2011年8月15日 下午 07:29
  •     If ListBox1.SelectedIndex < 0 Then
          Exit Sub
        End If
    
        Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
        hwnd1 = FindWindow(vbNullString, textBuilder)
    

    ListBox 成員

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.listbox_members%28VS.80%29.aspx

    • 已標示為解答 向恩 2011年8月16日 下午 12:56
    2011年8月16日 上午 02:37
  • 同一問題及衍生問題,應在同一討論緒繼續吧...

     


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

     謝謝  

     Joe Hung  的幫助 !

    2011年8月16日 下午 12:56
  •  <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
     Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
     ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
     End Function
    
    
    
    
    Private Const BM_CLICK = &HF5
    
     hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
     Dim x As IntPtr = FindWindowEx(hwnd1, 0, "IMClass", vbNullString)
    
    
    
    hwnd3 = FindWindowEx(x, 0, "Button", vbNullString)
    
      SendMessage(hwnd3, BM_CLICK, 0, 0)
    
    以上是代碼  我之前在VB6試的時候  用這幾行代碼 就可以實現 對搜尋到button這個類名的按鈕 進行點擊的動作!!
    不過現在移植到vb.net 就發現不行了   是哪邊要進行修改嗎?  
    x hwnd1 hwnd3 都有抓到控件的ID值
    請指教一下 謝謝


    2011年8月16日 下午 01:12
  •         hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
            hwnd3 = FindWindowEx(hwnd1, 0, "Button", vbNullString)
            SendMessage(hwnd3, BM_CLICK, 0, 0)
    

    2011年8月16日 下午 02:39
  • 請參考以下文章(.NET用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序[转]),我試了一下,是OK的哦!

    我建了一個Form1,中有2個Button(Button1, Button2)

    Public Class Form1
      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        MsgBox("WinServer button1")
      End Sub
    
      Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        MsgBox("WinServer button 2")
      End Sub
    End Class
    


    再建了一個Form2去Call Form1中的Button1

    Imports System.Runtime.InteropServices
    'http://blog.csdn.net/binyao02123202/article/details/6322782
    Public Class Form1
      <DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True)> _
      Private Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr
      End Function
    
      <DllImport("user32.dll", EntryPoint:="FindWindowEx", SetLastError:=True)> _
      Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As UInteger, lpszClass As String, lpszWindow As String) As IntPtr
      End Function
    
      <DllImport("user32.dll", EntryPoint:="SendMessage", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function SendMessage(hwnd As IntPtr, wMsg As UInteger, wParam As Integer, lParam As Integer) As Integer
      End Function
    
      <DllImport("user32.dll", EntryPoint:="SetForegroundWindow", SetLastError:=True)> _
      Private Shared Sub SetForegroundWindow(hwnd As IntPtr)
      End Sub
    
    
      Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Const BM_CLICK As UInteger = &HF5
        ' 鼠标点击的消息,对于各种消息的数值,大家还是得去API手册 
        Dim hwndForm1 As IntPtr = FindWindow(Nothing, "Form1")
        If hwndForm1 <> IntPtr.Zero Then
          '取得Button1
          Dim hwndThree As IntPtr = FindWindowEx(hwndForm1, 0, Nothing, "Button1")
           
          SetForegroundWindow(hwndForm1)
          ' 将计算器设为当前活动窗口 
          System.Threading.Thread.Sleep(2000)
          ' 暂停2秒让你看到效果 
          SendMessage(hwndThree, BM_CLICK, 0, 0)
          System.Threading.Thread.Sleep(2000)
           
    
          System.Threading.Thread.Sleep(2000)
          MessageBox.Show(" 你看到结果了嗎? ")
        Else
          MessageBox.Show(" 没有啟動 [Form1] ")
        End If
      End Sub
    End Class
    

    您試一下吧!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年8月16日 下午 03:16
  • 用這樣沒辦法 

     

    "Button"這個類名的視窗 是藏在hwnd1 中的"IMClass" 類中 所以我要先去抓"IMClass"類 

    hwnd3才能獲得相對應的值 不然hwnd3抓不到值

     

    2011年8月16日 下午 03:49
  • 我這邊基本上抓視窗的做法 跟你的是類似的  我現在的情況是 

    我抓得到視窗的ID值  SendMessage(hwndThree, BM_CLICK, 0, 0)

    可是在最後一段 這裡 發送的時候 發生了錯誤 代表我抓錯了值 才會發送錯誤的東西出去

    我用逐步執行去看變數的代碼 這邊BM_CLICK 它顯示值是245 UInteger 類 不曉得跟你的狀況一不一樣

      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
      Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
      ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
      End Function 
    
    
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        Dim s As String
        Dim hwnd1 As IntPtr
        Dim b As IntPtr
        'Dim lCount As Long
        Dim hwnd3 As IntPtr
        Const BM_CLICK As UInteger = &HF5
    
    
        ' ??? CALL  List1_Click() 內存視窗資料過來 以發送
    
        If ListBox1.SelectedIndex < 0 Then
          Exit Sub
        End If
    
        'Dim textLength As Integer = GetWindowTextLength(hwnd5)
        'Dim textBuilder As New StringBuilder(textLength)
        'hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
    
        Dim textBuilder As String = ListBox1.Items(ListBox1.SelectedIndex)
        hwnd1 = FindWindow(vbNullString, textBuilder)
        Dim x As IntPtr = FindWindowEx(hwnd1, 0, "IMClass", vbNullString)
        b = FindWindowEx(x, 0, "YIMInputWindow", vbNullString)
        SendMessage(b, WM_SETTEXT, 0, (RichTextBox2.Text).ToString)
        s = RichTextBox2.Text
        'If s.Length <> 0 Then
        hwnd3 = FindWindowEx(x, 0, "Button", vbNullString)
    
        SetForegroundWindow(hwnd3)
    
        SendMessage(hwnd3, BM_CLICK, 0, 0)
        'End If
    
    
      End Sub
    


    這是我目前修改的代碼值  目前還是無法發送 不過hwnd3 跟x那些窗口都抓得到ID值

    不曉得是不是我抓錯ID值 還是BM_CLICK 指定的值不正確  請各位在指導一下!

    2011年8月16日 下午 04:37
  • 一步步來Trace吧!

    1.請問Window有取到嗎SetForegroundWindow(hwnd1)看看有跑到上層來嗎?

    2.請Window上的Caption名稱就叫"Button"嗎?  那個Button是被包在IMClass之中? IMClass是個GroupBox嗎? 還是什麼物件呢?? 我可以試看看哦! 

    我後來在被Call的Form1上加了一個GroupBox,裡面放一個Button2的Button,然後在Call的程式中,先取Form->GroupBox->Button2,是可以取到的哦!

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Const BM_CLICK As UInteger = &HF5
        ' 鼠标点击的消息,对于各种消息的数值,大家还是得去API手册 
        Dim hwndForm1 As IntPtr = FindWindow(Nothing, "Form1")
        If hwndForm1 <> IntPtr.Zero Then
    '取Form上的GroupBox1
          Dim hwndGroupBox1 As IntPtr = FindWindowEx(hwndForm1, 0, Nothing, "GroupBox1")
          '取得GroupBox中的Button2
          Dim hwndButton As IntPtr = FindWindowEx(hwndGroupBox1, 0, Nothing, "Button2")
    
          SetForegroundWindow(hwndForm1)
    
          System.Threading.Thread.Sleep(1000)
          ' 暂停1秒让你看到效果 
          SendMessage(hwndButton, BM_CLICK, 0, 0)
          System.Threading.Thread.Sleep(1000)
    
    
          System.Threading.Thread.Sleep(2000)
          MessageBox.Show(" 你看到结果了嗎? ")
        Else
          MessageBox.Show(" 没有啟動 [Form1] ")
        End If
      End Sub
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年8月16日 下午 11:21
  • 即時通最新版本11.0.0.2009-tw,安裝在Windows 7家用進階版64位元,在下的寫法是可行的,用SPY++去看,IMClass這個類別不存在...
    2011年8月17日 上午 01:20
  • 恩 我測試的對象 在即時通最新版本11.0 的確可以運行 但是我在測試8.1版 他這個版本就比較特別  

     

    "YIMInputWindow" 跟"Button" 這些類別的項目 是存在於"YSearchMenuWndClass" 類別中的"IMClass" 類別下  

    這使我產生了興趣  因為我本來 
    hwnd1 = FindWindow(vbNullString, textBuilder.ToString())
        hwnd3 = FindWindowEx(hwnd1, 0, "Button", vbNullString)
        SendMessage(hwnd3, BM_CLICK, 0, 0)
    
    也是引用這些代碼就可以抓到即時通的 
    "YIMInputWindow" 跟"Button" 不用額外加入"IMClass"  但在8.1下需要 
    所以我加入了 "IMClass"去搜尋"YIMInputWindow" 跟"Button"   這樣才搜得到視窗 不過卻不曉得因為是什麼原因 
    不能使用"Button" 這是令我疑惑的一個地方  我個人比較研究這些小細節的現象  希望見怪不怪! 

     

    2011年8月17日 上午 02:29
  • 目前完全沒有方向  我想多多了解Internet Explorer_Server 的東西 比如說我想要 把在Internet Explorer_Server 這個欄目下的窗口

    一行一行的字串抓下來 儲存成一個字符  跟我要向 Internet Explorer_Server  這個窗口 發送訊息的字符 該怎麼做呢?

    該用COM 或 .NET元件來做  在VB6中 我是曉得 如果要這樣做的話 應該要先設定引用項目Microsoft html object library 這個項目 來支援網路的功能

    在VS2010 中 COM元件中 也有相對應的 Microsoft html object library  但我要做到以上我列舉的動作 該怎麼做呢?

    可以用.NET 去實現這個功能嗎?  因為.NET還不太會用 請熟悉的老手 指導一下 謝謝!

    2011年8月18日 下午 05:10
  • 如果您是要解析HTML文件的內容, 可以參考:Parsing HTML without Using the Browser Control


    2011年8月19日 上午 03:53
  • 恩恩  這個對我有幫助  謝謝 THIS 我今天也研究了一整天

    http://msdn.microsoft.com/zh-tw/library/system.windows.forms.htmldocument.aspx

    提供最上層的程式方式存取,以存取 WebBrowser 控制項所裝載的 HTML 文件。 用這個應該可以加載  Internet Explorer_Server

     

    我注意到了 

    Title

    取得或設定目前 HTML 文件中 <TITLE> 標記的文字值。

    用這個屬性 可以加載 HTML 上的文字  我去研究網頁上的原始碼 有這個東西  但是即時通上對話攔也是 Internet Explorer_Server

    我想要研究它的原始碼  不曉得從哪裡著手  因為我想要把即時通上面對話攔的文字抓取下來 儲存成字符  請各位老手在指導一下 該怎麼

    研究即時通上 Internet Explorer_Server 的原始碼呢?

    2011年8月19日 下午 02:01
  • Internet Explorer Server 是啥?有 Internet Explorer Object ,看 MSDN Web Developement 那邊就有了,跟 WebBrowser Control 大部分方法、屬性相同,少部分只有 InternetExplorer Object 才有。

    要抓網頁在 VSNET 下請用 WebClient 。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月19日 下午 03:47
  • Internet Explorer Server  是我用SPY++ 去搜索窗口 得到的類別名稱  比如說搜尋IE上的網頁窗口  或是即時通的對話窗口

    都會得到這個類別名稱Internet Explorer Server

    我之前無意間看到就是類似 有網友提說可以用findwindowEX 這個API的函數 去搜索Internet Explorer Server這個窗口 然後對這個窗口做處理!!

    可以搜索窗口中的字符 或是做其他什麼事...   我也不太清楚 !@@



    Private Type UUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
    End Type
    
    Private Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
    End Type
    
    Private Const WM_GETTEXT = &HD
    Private Const SMTO_ABORTIFHUNG = &H2
    Private Declare Function ObjectFromLresult Lib "oleacc" (ByVal lResult As Long, riid As UUID, ByVal wParam As Long, ppvObject As Any) As Long '檢索請求的接口指針訪問對象為根據先前生成的對象的引用
    Private Declare Function RegisterWindowMessage Lib "user32" Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
    Private Declare Function SendMessageTimeout Lib "user32" Alias "SendMessageTimeoutA" (ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, lParam As Any, ByVal fuFlags As Long, ByVal uTimeout As Long, lpdwResult As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
    
    Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
    Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long '由座標取得hWnd
    Private Declare Function GetForegroundWindow Lib "user32" () As Long '取得現用視窗hWnd
    Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long '取得現用視窗座標
    
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    
    Private Sub Timer1_Timer()
     
     On Error Resume Next
     
     Dim Hwn As Long, rHw As Long, S As String, Obj As HTMLDocument
     Dim S2 As String
     Dim R As RECT
     Dim STemp(0) As String
     
     Hwn = GetForegroundWindow()  '取得現用視窗hWnd
     GetWindowRect Hwn, R   '取得現用視窗的座標
     
     '''''''''''''用於判斷視窗標題''''''''''''''''''''''''''''''''''''''''
     STemp(0) = String(100, " ")
     GetWindowText Hwn, STemp(0), Len(STemp(0))
     STemp(0) = Left(STemp(0), InStr(1, STemp(0), Chr(0), vbBinaryCompare) - 1)
    
     If Right(STemp(0), 7) = "Firefox" Then  '遇到FF時跳出程式
      Exit Sub
     ElseIf Right(STemp(0), 17) = "Internet Explorer" Then '遇到IE時跳出程式
      Exit Sub
     End If
     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
     
     rHw = WindowFromPoint(R.Left + 16, R.Top + 150)  '取得該座標的hWnd (聊天內容)
     
     S2 = String(100, " ")
     GetClassName rHw, S2, Len(S2)
     If InStr(1, S2, "Internet Explorer_Server", vbTextCompare) <> 0 Then
      Set Obj = WDom(rHw)
      If Not (Obj Is Nothing) Then
       Text1(0) = Obj.body.innerText
      End If
     Else
      Text1(0) = ""
     End If
     
     rHw = WindowFromPoint(R.Left + 16, R.Bottom - 40) '打字內容
     
     S2 = String(100, " ")
     GetClassName rHw, S2, Len(S2)
     If InStr(1, S2, "YIMInputWindow", vbTextCompare) <> 0 Then
      S = String(GetWindowTextLength(rHw) + 1, Chr$(0))
      SendMessage rHw, WM_GETTEXT, Len(S), S
      S = Replace$(S, Chr(0), "")
      Text1(1) = S
     Else
      Text1(1) = ""
     End If
    End Sub
    
    'Internet Explorer_Server
    Private Function WDom(ByVal hWnd As Long) As HTMLDocument
     Dim U As UUID, L As Long, M As Long 'L Long,用於裝載函數結果的一個變量
     M = RegisterWindowMessage("WM_HTML_GETOBJECT") '抓取字符 符 msg Long,消息的標識符
     If M <> 0 Then
      SendMessageTimeout hWnd, M, 0, 0, SMTO_ABORTIFHUNG, 1000, L '向窗口發送一條消息。如窗口位於不同的線程中,則利用這個函數可以指定一個超時值,以便在另一個進程掛起的時候防止調用進程也永遠掛起
      If L <> 0 Then
       With U
        .Data1 = &H626FC520: .Data2 = &HA41E
        .Data3 = &H11CF: .Data4(0) = &HA7
        .Data4(1) = &H31: .Data4(2) = &H0
        .Data4(3) = &HA0: .Data4(4) = &HC9
        .Data4(5) = &H8: .Data4(6) = &H26
        .Data4(7) = &H37
       End With
       ObjectFromLresult L, U, 0, WDom
      End If
     End If
    End Function
    

     

    這個是利用鼠標去抓取 Internet Explorer Server 這個窗口的字符  我目前的方向就是朝著跟他類似的想法

    我想利用findwindowEX 去搜索這個窗口 然後將它的資料抓取下來做處理   這個也要加載Microsoft html object library

    才能運行   也提供給回復我的人做參考


    • 已編輯 向恩 2011年8月19日 下午 05:50
    2011年8月19日 下午 04:30
  • 所以你一開始的問題要這樣簡短的問嗎?

    這段程式碼從即時通讀取文字,已涉及違反置頂公告:張貼文章應注意事項及應提供資訊

    定義的:禁止討論惡意程式的撰寫

    監控程式列為注意對象,比如說鍵盤、滑鼠測掃、封包的過濾攔截可能被視為木馬的一種,依照討論內容來判斷。

    註:封包監聽可能涉及刑法妨害秘密罪,此類程式撰寫討論時,請明確說明應用範圍與方向,以便判讀是否屬於惡意程式。

     


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年8月19日 下午 05:33
  • 我是要開發做 即時通AI 使用的   這個應該不構成犯罪巴...

    我要將 所有即時通對方發話的字符 擷取下來  然後透過AI 去回覆訊息 

    這方面的東西 也有人開發過類似的  !   並沒有要做不法用途


    且還有想研究一下 網頁中的  要發送對網頁中的欄目 發送字串這些資料時  該怎麼做!
    2011年8月19日 下午 05:56
  • 抓對話欄的文字可以考慮直接攔截封包, 才不會抓到重覆的內容
    2011年8月20日 上午 03:56
  • 恩恩  不過我現在還搞不太清楚  你說攔截封包的機制 

     

    'Internet Explorer_Server
    Private Function WDom(ByVal hWnd As Long) As HTMLDocument
     Dim U As UUID, L As Long, M As Long 'L Long,用於裝載函數結果的一個變量
     M = RegisterWindowMessage("WM_HTML_GETOBJECT") '抓取字符 符 msg Long,消息的標識符
     If M <> 0 Then
     SendMessageTimeout hWnd, M, 0, 0, SMTO_ABORTIFHUNG, 1000, L '向窗口發送一條消息。如窗口位於不同的線程中,則利用這個函數可以指定一個超時值,以便在另一個進程掛起的時候防止調用進程也永遠掛起
     If L <> 0 Then
      With U
      .Data1 = &H626FC520: .Data2 = &HA41E
      .Data3 = &H11CF: .Data4(0) = &HA7
      .Data4(1) = &H31: .Data4(2) = &H0
      .Data4(3) = &HA0: .Data4(4) = &HC9
      .Data4(5) = &H8: .Data4(6) = &H26
      .Data4(7) = &H37
      End With
      ObjectFromLresult L, U, 0, WDom
     End If
     End If
    End Function
    


    它這個Data 值是怎麼抓出來的 知道的人 可以跟我說明一下嗎? 我現在打算直接調用這段代碼 下去改 還有下面這個

    Private Type UUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
    End Type
    
    


    這個東西 在VB.NET要怎麼改呢?

     Private Structure UUID
        Dim Data1 As Long
        Dim Data2 As Integer
        Dim Data3 As Integer
        Dim Data4 As Byte
      End Structure
    


    我直接貼到 VB2010裡面 我看它錯誤說明 說要把Type 改成Structure

    然後Data1 As Long 這個前面也要加入 Dim 才可以

    這一行 Dim Data4 As Byte >> 我想直接寫成Dim Data4(0 to 7) As Byte 結果卻顯示 宣告為結購成員的陣列無法以初始大小宣告

    這段該怎麼改才正確呢?  請指教一下

     

    2011年8月20日 上午 05:11
  • 請參考

    http://www.vbforums.com/showthread.php?t=357928

    Public Structure UUID
        Public Data1 As Long
        Public Data2 As Integer
        Public Data3 As Integer
        Private m_Data4() As Byte
    
        Public ReadOnly Property Data4() As Byte()
          Get
            If Me.m_Data4 Is Nothing Then
              ReDim Me.m_Data4(7)
            End If
    
            Return Me.m_Data4
          End Get
        End Property
      End Structure
    



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年8月20日 上午 05:32
  • 謝謝 亂馬客  這個對我很有幫助 感謝

    我現在還有另個問題  就是代碼中的

     

    Data1 = &H626FC520: .Data2 = &HA41E
     .Data3 = &H11CF: .Data4(0) = &HA7
     .Data4(1) = &H31: .Data4(2) = &H0
     .Data4(3) = &HA0: .Data4(4) = &HC9
     .Data4(5) = &H8: .Data4(6) = &H26
     .Data4(7) = &H37
     End With
    

    這段 是要使用什麼工具 才能得到這些數組  請知道的人也回覆我一下 謝謝

    還有下面這段

     ObjectFromLresult L, U, 0, WDom


    u這邊出現了錯誤訊息 :錯誤 6 型別 'WindowsApplication1.Form1.UUID' 的值無法轉換成 'System.Guid'。 C:\Users\tom\Desktop\即時通AI 2010\Form1.vb 334 38 WindowsApplication1

     

    根wdom也出現了錯誤訊息 :錯誤 7 'Public Shared Function ObjectFromLresult(lResult As System.UIntPtr, refiid As System.Guid, wParam As System.IntPtr) As Object' 的引數太多。 C:\Users\tom\Desktop\即時通AI 2010\Form1.vb 334 44 WindowsApplication1

    請問這邊該怎麼修改

    2011年8月20日 上午 07:13
  • 如果是做即時通的 AI 回應,請直接參閱各即時通提供的 API 文件,可直接透過程式來進行應對交談。

     


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

    心冷大大 講的應該是這個巴  不過我看不懂  不曉得該怎麼應用這些API

    我目前只使用過windowAPI  還沒接觸過其他的API 

    請心冷大大  能提供一下運用這些API的範例碼給我

    因為我不曉得在VB.NET中怎麼使用這些東西

    我目前要做的動作就是把 對方的對話能逐字逐句的 儲存成字符 

    只能麻煩心冷大大在指導一下 這些文件使用的方法 感激不盡


    2011年8月20日 下午 01:10
  • 你如果手上沒字典,網路上免費翻譯的字典很多。

     

    你所描述的需求,我會當成惡意側錄的程式。


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

    因為我真的不曉得要如何使用這些API 

    網路翻譯  我直接使用 GOOGLE瀏覽器去直接翻譯那些文章 我也大概看得懂意思

    就是不曉得要怎麼使用這個 才會發問 !

    http://pinvoke.net/  如 windowAPI  我知道該使用什麼功能 搜索API關鍵字 去查詢該做什麼聲明

    http://developer.yahoo.com/forum/Messenger-IM-SDK/?page=1&sortby=createtime 這邊也有論壇在討論 

    即時通API的用法 但是沒有VB的範例  我也很難著手  我程度還不到心冷大大這樣 可以任意的使用任何的API 能在VB.NET中加入適當的聲明

    所以我打算還是回歸我原本的思路

     

     

    Public Structure UUID
     Public Data1 As Long
     Public Data2 As Integer
     Public Data3 As Integer
     Private m_Data4() As Byte
    
     Public ReadOnly Property Data4() As Byte()
     Get
     If Me.m_Data4 Is Nothing Then
     ReDim Me.m_Data4(7)
     End If
    
     Return Me.m_Data4
     End Get
     End Property
     End Structure
    
    
     Private Const WM_GETTEXT = &HD
     Private Const SMTO_ABORTIFHUNG = &H2
    
    
    Dim hwnd5 As IntPtr
    Dim hwnd2 As IntPtr
    hwnd2 = GetDesktopWindow()
     
    hwnd5 = FindWindowEx(hwnd2, 0, "CConvWndBase", vbNullString) '(YSearchMenuWndClass)<<即時通對發話窗口類名 
    
    Dim hwnd3 As IntPtr = FindWindowEx(hwnd5, 0, "YHTMLContainer", vbNullString) '截取即時通對話
     
    Dim hwnd7 As IntPtr= FindWindowEx(hwnd3, 0, "Internet Explorer_Server", vbNullString)
    Dim obj As HtmlDocument S2 = String(100, " ") << '需要修改 Set Obj = WDom(hwnd7) <<< '需要修改 Private Function WDom(ByVal hWnd As Long) As IHtmlDocument Dim U As UUID, L As Long, M As Long 'L Long,用於裝載函數結果的一個變量 M = RegisterWindowMessage("WM_HTML_GETOBJECT") '抓取字符 符 msg Long,消息的標識符 If M <> 0 Then SendMessageTimeout(hWnd, M, 0, 0, SMTO_ABORTIFHUNG, 1000, L) '向窗口發送一條消息。如窗口位於不同的線程中,則利用這個函數可以指定一個超時值,以便在另一個進程掛起的時候防止調用進程也永遠掛起 If L <> 0 Then 'L Long,用於裝載函數結果的一個變量 With U .Data1 = &H626FC520 : .Data2 = &HA41E .Data3 = &H11CF : .Data4(0) = &HA7 .Data4(1) = &H31 : .Data4(2) = &H0 .Data4(3) = &HA0 : .Data4(4) = &HC9 .Data4(5) = &H8 : .Data4(6) = &H26 .Data4(7) = &H37 End With ObjectFromLresult(L, U, 0, WDom) '檢索請求的接口指針訪問對象為根據先前生成的對象的引用 封送資料 End If End If End Function Private Sub ObjectFromLresult(ByVal L As Long, ByVal U As UUID, ByVal p3 As Integer, ByVal WDom As IHtmlDocument) ' Throw New NotImplementedException End Sub
     ---------------------------------------------------------------------------------------------------------------------------------
     S2 = String(100, " ") << '需要修改
    
    Set Obj = WDom(hwnd7) <<< '需要修改
    

     

    我利用去抓取對話窗口的方法 然後把字符抓下來  以上這兩段VB6 在VB.NET的用法 不曉得該怎麼做轉換  請高人指點一下  謝謝!

     






    2011年8月21日 上午 01:50
  • 關於這個問題  我之後上 VB總官方論壇 去發問  一個國外的網友 它簡單的變動了一下 SendMessage 這個API宣告的方法 達成了我的目的
    這邊也提供給大家 當作參考!
    原本的API:
     <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
     Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
     End Function
    後來變更的API:
     
      <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
        Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, _
      ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
        End Function
    


    2011年8月21日 上午 02:54
  • 我爬文 看到說目前.NET 不再支持 SET這個類別的指令 直接打像下面這樣就好了

    obj = WDom(hwnd7)

    可是會出現

    錯誤訊息:

    錯誤 1 型別 'WindowsApplication1.IHtmlDocument' 的值無法轉換成 'System.Windows.Forms.HtmlDocument'。 C:\Users\tom\Desktop\即時通AI 2010\Form1.vb 223 23 WindowsApplication1

     Private Function WDom(ByVal hWnd As Long) As IHtmlDocumen 這段我也有做修改

     Private Function WDom(ByVal hWnd As IntPtr) As IHtmlDocumen
    
    改成這樣 還是會出現上面那個錯誤訊息 麻煩知道該怎麼在這裡做變動的人指導我這邊一下 謝謝

     

     

    2011年8月22日 下午 12:06