句柄我是一知半解,现在我想问一下:
1、某软件只能在微机上运行一个,我想问下,此软件的句柄在不同的微机上面会不会相同??其下属的控件的句柄呢?
2、若不同,有什么好办法快速得到其子控件的句柄?(那么用spylite获取的句柄不就没有用了??)

解决方案 »

  1.   


    '句柄是指当前进程 的一种标示. 用于Windows系统对进程进行处理, 每运行一次,句柄都会不一样.
    '以下是以计算器为例对计算器的内容进行操作.Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As LongConst GW_HWNDFIRST = 0
    Const GW_HWNDLAST = 1
    Const GW_HWNDNEXT = 2
    Const GW_HWNDPREV = 3
    Const GW_OWNER = 4
    Const GW_CHILD = 5
    Const GW_MAX = 5
    Dim fHwnd As Long
    Dim cHwnd As Long
    Private Sub Command1_Click()
      fHwnd = FindWindow(vbNullString, "计算器")
       
       cHwnd = GetNextWindow(fHwnd, GW_CHILD) '取得计算器下第一个子控件的句柄
       
       Dim Data As String * 10
       Call GetWindowText(cHwnd, Data, 10)
       
       While Not (Mid(Data, 1, 1) = 8) '取得数字8所在的按扭的句柄 (对取得的句柄控件上面的文字进行判断)
          cHwnd = GetNextWindow(cHwnd, GW_HWNDNEXT) '取得下一个子控件的句柄
          Call GetWindowText(cHwnd, Data, 10) '取得控件上的Caption
          DoEvents
       Wend
       MsgBox Data
    End Sub
      

  2.   

    我个人的理解是:句柄是一个标识符,是Windows标识对象或者项目的一个长整数,这里的对象或者项目可以是窗口、菜单、控件、模块、任务、实例、字体、资源……等,它由Windows临时分配,也就是说,同一对象或项目上一次运行和下一次运行可能就不相同。
      

  3.   

    同意
    可以根据caption找到此窗口,再得到句柄,再用for each 循环得到其子控件的句柄
      

  4.   

    那么我想问下使用spylite软件以获取的句柄不就没有用了???
      

  5.   

    那么spylite软件在设计时具体能有些什么用处呢??
      

  6.   

    每次运行句柄就不同,更别说在别的微机上了(其实有点不搭噶)
    spylite获取当前运行的句柄,怎么没用
      

  7.   

    spylite获取当前运行的句柄是一个十六进制值,程序重新打开这个值不是就变了,那不是只在程序未销毁之前有用,如果有FindWindow GetNextWindow GetWindowText 这些api函数来重新获取才有用吧?我是新手,对操作外部程序也有兴趣,对句柄不够了解。敬请解释一下。还有上面计算器的例子获取按钮8的标题,如果我想按下按钮8该怎么做?谢谢!
      

  8.   

    我昨天试了下,其实不用执着于句柄那串数字,关键是用spylite来找它的类名,类名一般就不变,先用程序的标题找它的程序类名,接着找控件类名,相同控件多了就麻烦一点,所以spylite用处也挺大。主要用FindWindow,FindWindowEx这两个函数。