在VB中可以用SendKeys 或 SendMessage 发送消息  但如果对象的Hwnd为0,我该怎么发送   如发送ESC键

解决方案 »

  1.   

    Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
      

  2.   

    或许对你有帮助:http://www.vbaccelerator.com/home/VB/Tips/SendKeys_using_the_API/SendKeys_Demonstration_zip_cSendKeys_cls.asp
      

  3.   

    但如果对象的Hwnd为0,我该怎么发送
    ///那是你没有正确获取到对象的HWND
      

  4.   

    //那是你没有正确获取到对象的HWND也有可能是轻权控件,本身就没有句柄
    发送按键用sendkeys就可以了,关键是你的程序不能转移输入焦点
      

  5.   

    hwnd不可能获取错误
    我和获取前台窗体句柄API  获取Ctrl + Alt + Del  后出现的窗体 hwnd  确实为0
      而且窗体标题栏也为空
      

  6.   

    你是获取了哪个窗体,能说说吗?最好把相关获得HWND的代码也帖出来。
      

  7.   

    //获取Ctrl + Alt + Del 后出现的窗体 hwnd 确实为0
    而且窗体标题栏也为空是任务管理器吗?//hwnd不可能获取错误
    对不对,你用spy++看看就知道了
    顺便问一下,你打算做什么呢?
      

  8.   

    不是任务管理器是在按了Ctrl + Alt + Del 后出现的第一个全屏窗口,就是Windows安全(Windows 2000 Server)    用获取前台窗体句柄的API  返回值  的的确确是0,  不可能有错
       继续请教
      

  9.   

    我用以下代码实验了此功能(Windows XP),但效果不理想, 哪位兄弟帮我改一下Option Explicit
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
     Const sc_close = 2
     
    Private Sub Timer1_Timer()    DoEvents
        
        Dim SysFormHwnd As Long
        
        SysFormHwnd = FindWindow(vbNullString, "Windows 任务管理器")
        
        Caption = SysFormHwnd
        SendMessage SysFormHwnd, sc_close, 0, 0
        
    End Sub注: Timer1.Interval = 1
      

  10.   

    //我用以下代码实验了此功能(Windows XP),但效果不理想, 哪位兄弟帮我改一下很明显,发送的消息不对,修改如下:
    Option Explicit
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As Long
    Private Const WM_CLOSE = &H10
    Private Sub Timer1_Timer()DoEventsDim SysFormHwnd As LongSysFormHwnd = FindWindow(vbNullString, "Windows 任务管理器")Caption = SysFormHwnd
    SendMessage SysFormHwnd, WM_CLOSE, 0, 0End Sub
      

  11.   

    在xp下还可以这样屏蔽任务管理器:
    Private Sub Form_Load()
        Dim s As String
        s = Environ("windir")
        s = s + "\system32\taskmgr.exe"
        Open s For Random Lock Read As #1
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Close #1
    End Sub
      

  12.   

    rainstormmaster(暴风雨 v2.0)   你的例子好像可以  但我没办法测试 
                     不知道  taskmgr.exe  是个什么文件    继续请教
      

  13.   

    // 不知道 taskmgr.exe 是个什么文件windows里面的任务管理器