主  题:难
作  者:human_2
所属论坛:Visual Basic
问题点数:20
回复次数:4
发表时间:2002-1-5 15:26:51
 
  
  寻找一个窗口,让该窗口得到焦点,然后发送按键 
回复贴子: 
回复人: xuezheng(回风舞雪) (2002-1-5 15:29:19)  得0分 
use API 
have a try  
回复人: human_2(风一帆) (2002-1-6 14:45:04)  得0分 
可是我不知道,  
回复人: Bardo(巴顿) (2002-1-6 14:55:17)  得20分 
FincWindow 找
SendMessage 焦点
SetForgroundWindow 显示
SendMessage 发送键  
回复人: human_2(风一帆) (2002-1-6 15:51:12)  得0分 
能写的详细些吗?  

解决方案 »

  1.   

    在Windows下编程,经常发现有不少功能Windows系统已经做了,如果能够直接调用,就可省去不少程序的编写,并能提高程序的运行效率。在很多情况下,我们都可以用“Ctrl + X”、“Ctrl + C”、 “Ctrl + V”和“Ctrl + Z”分别进行“剪切”、“复制”、“粘贴”和“撤消”操作,由此想到,如果我们能够在程序中调用系统的这些功能,就无需为如何实现这些操作而操心了。经过不断的探索,终于发现SendMessage和PostMessage能够担此重任,真是如获至宝,于是迫不及待地把它们介绍给各位朋友。  用VB5的“API浏览器”可以很容易地找到这两个API 函数:  Declare Function SendMessage Lib “user32” Alias “SendMessageA” _(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _lParam As Any) As Long
      Declare Function PostMessage Lib “user32” Alias “PostMessageA” _(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _ByVal lParam As Long) As Long 
      这两个函数的功能几乎是一样的,只是SendMessage是直接调用Windows函数来发送消息,只有这个消息完全被处理后此函数才返回,而PostMessage则给窗体的消息队列增加一个消息,这个消息将在未来某个时候进行正常事件处理时得到处理。以下仅以SendMessage为例。
      函数中虽然有四个参数,但关键的是前两个:hwnd 和wMsg。Hwnd是句柄,Microsoft Windows应用程序中的每个窗体和控件都拥有一个句柄,通过句柄可以指明函数的操作对象;wMsg是一个十六进制数,代表了函数要发送的具体消息。
      下面以具体例子说明如何用SendMessage实现“剪切”、“复制”、“粘贴”、“撤消” 和“删除”功能:  在窗体中放置一个文本框Text1和五个按钮,分别执行以上五种功能,编写以下程序。
      Option Explicit
      Private Declare Function SendMessage Lib “user32” Alias “SendMessageA” _
      (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
      lParam As Any) As Long
      Const WM_CUT = &H300
      Const WM_COPY = &H301
      Const WM_PAST = &H302
      Const WM_CLEAR = &H303
      Const WM_UNDO = &H304
      Dim fb As Long
      
      Private Sub cmdClear_Click()
       fb = PostMessage(Text1.hwnd, WM_CLEAR, 0, 0)
      End Sub
      Private Sub cmdCopy_Click()
       fb = SendMessage(Text1.hwnd, WM_COPY, 0, 0)
      End Sub
      Private Sub cmdCut_Click()
       fb = SendMessage(Text1.hwnd, WM_CUT, 0, 0)
      End Sub
      Private Sub cmdPast_Click()
       fb=SendMessage(Text1.hwnd, WM_PAST, 0, 0)
      End Sub
      Private Sub cmdUndo_Click()
       fb=SendMessage(Text1.hwnd, WM_UNDO, 0, 0)
      End Sub 
      除了TextBox外SendMessage 还可以对RitchTextBox和ComboBox等进行操作,只要相应改变hwnd参数即可。
      

  2.   


    在这一期的SendMessage函数应用中,我将向大家介绍如何利用消息函数来扩展树型列表(TreeView)控件的功能相信对于树型列表控件大家十分的熟悉,典型的应用就是Windows资源管理器中的目录列表。在VB中,树型列表控件包含在Microsoft Windows Common Control 6.0(也可能是5.0,视你的VB或者系统版本而定)中。在Windows API中,有一系列的以TVM_ 开头的消息值,这些消息就是扩展树型列表控件所特定的消息值,下面向大家介绍其中的一些应用。  1、设置树型列表控件的背景颜色  首先做如下的定义:Private Declare Function SendMessage Lib "user32" Alias "Send MessageA" (ByVal hwnd As Long,ByVal wMsg As Long, ByVal wParam As Long,ByVal lParam As Long) As Long
      Const TV-FIRST = &H1100
      Const TVM-SETBKCOLOR = TV_FIRST + 29   然后再作如下调用:Call SendMessage(TreeView1.hwnd, TVM-SETBKCOLOR, 0, RGB(255, 0, 0))   上面的SendMessage调用将TreeView1的背景颜色设置为红色。  大家可能注意到了。在上面的Sendmessage函数定义中,我们将lParam定义为 ByVal lParam As Long,而不是象前面的那些范例那样定义为Any或者String类型,关于这个问题,我会在最后的一章中做介绍。
    2、设置树型列表控件标题行高度  利用TVM_SETITEMHEIGHT消息可以设定控件的标题行的高度,该消息的定义及调用方法如下:  定义: Const TV_FIRST = &H1100
      Const TVM-SETITEMHEIGHT = TV_FIRST + 27
      Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long,ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long 
      
      调用:   CallSendMessage(TreeView1.hwnd, TVM-SETITEMHEIGHT, 60, 0) 
      上面的代码将TreeView1的标题行高度设置到60像素高  3、为树型列表控件中不同的标题行设置不同的提示  在第一期的ListBox控件介绍中,我向大家介绍了如何为列表中的每一个标题行设置不同的提示(ToolTips),在这里为要向大家介绍如何为树型列表控件中的每一个标题设置不同的提示。  同ListBox控件不通,树型列表控件中并没有根据光标位置获得标题行索引的消息,我们需要另外想办法。在TVM类消息中有一个TVM_HITTEST消息,发送该消息可以检测控件表面上的某一点,如果该点位于一个标题上,则返回该标题的句柄。而利用TVM_GETITEM消息,则可以根据标题句柄返回该标题行的文本。所以结合利用这两个消息可以获取光标所在标题行的标题文本。具体的范例代码如下:
      

  3.   

    参考:http://www.csdn.net/expert/topic/450/450596.shtm
    (怎么样将我的程序中的文本发送到QQ的对话框中并送出去!(急))
      

  4.   

    Option Explicit Private Type TPoint
      x As Long
      y As Long
      End Type
      Private Type TVHITTESTINFO
      pt As TPoint
      flags As Long
      hItem As Long
      End Type
      Private Type TVITEM
      mask As Long
      HTreeItem As Long
      state As Long
      stateMask As Long
      pszText As Long
      cchTextMax As Long
      iImage As Long
      iSelectedImage As Long
      cChildren As Long
      lParam As Long
      End Type
      Const TV-FIRST = &H1100
      Const TVM_HITTEST = TV-FIRST + 17
      Const TVM_GETITEM = TV-FIRST + 12
      Const TVHT-ONITEMLABEL = &H4
      Const TVIF-TEXT = &H1
      Const GMEM-FIXED = &H0
      Private Declare Function Send MessageRef Lib"user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long,lParam As Any) As Long
      Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As String,ByVal Source As Long,ByVal Length As Long)
      Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
      Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
      Dim hItemPrv As Long
      Private Sub Form_Load()
      Dim ndX As Node
      '加入若干Item
      Set ndX = TreeView1.Nodes.Add(, , "R", "Root")
      Set ndX = TreeView1.Nodes.Add("R", tvwChild, "Key1", "Node1")
      Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey1", "SubNode1")
      Set ndX = TreeView1.Nodes.Add("SubKey1", tvwChild, "SubKeys1", "SubNode1")
      Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey2", "SubNode2")
      Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey3", "SubNode3")
      Set ndX = TreeView1.Nodes.Add("Key1", tvwChild, "SubKey4", "SubNode4")
      End Sub
      Private Sub TreeView1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 
      Dim ptA As TPoint
      Dim tf As TVHITTESTINFO
      Dim tv As TVITEM
      Dim hStr As Long
      Dim hItem As Long
      Dim astr As String * 1024
      Dim bstr
      On Error GoTo errLab
      '获得当前光标所在的位置坐标
      ptA.x = Int(x / Screen.TwipsPerPixelX)
      ptA.y = Int(y / Screen.TwipsPerPixelY)
      tf.pt = ptA
      tf.flags = TVHT_ONITEMLABEL
      '获得光标所在的Item的句柄
      hItem = SendMessageRef(TreeView1.hwnd, TVM_HITTEST, 0, tf)
      '如果未获得句柄或者同上一次是同一个Item的句柄则退出
      If ((hItem <= 0) Or (hItem = hItemPrv)) Then Exit Sub
      hItemPrv = hItem
      '分配一定的内存空间用以存储Item的标题
      hStr = GlobalAlloc(GMEM-FIXED, 1024)
      If hStr > 0 Then
      tv.mask = TVIF_TEXT 
      '获取标题文本
      tv.HTreeItem = hItem
      'Item句柄
      tv.pszText = hStr
      tv.cchTextMax = 1023
      '发送TVM_GETITEM获得标题文本
      CallSendMessageRef(TreeView1.hwnd, TVM-GETITEM, 0, tv)
      '将标题文本拷贝到字符串astr中
      CopyMemory astr, hStr, 1024
      bstr = Left$(astr, (InStr(astr, Chr(0)) - 1))
      TreeView1.ToolTipText = bstr
      '释放分配的内存空间
      GlobalFree hStr
      End If
      Exit Sub
      errLab:
      Resume Next
      End Sub 
       运行上面的程序,当光标在TreeView1上面移动时,TreeView1的ToolTips就会根据光标所在的不同标题行而变动。  以上程序在Win98、Win2000,VB6下运行通过。
      

  5.   

    : wjq(b_wind) (2002-1-6 17:02:11)  得0分 
    参考:http://www.csdn.net/expert/topic/450/450596.shtm
    (怎么样将我的程序中的文本发送到QQ的对话框中并送出去!(急))  获得句炳就可以  看我的第一个会贴
      

  6.   

    谢谢大家,不过我已经解决了,
    http://www.csdn.net/expert/Topic/458/458936.shtm