Const HWND_TOPMOST = -1
  Const SWP_NOSIZE = &H1
  Const SWP_NOMOVE = &H2
  Const SWP_SHOWWINDOW = &H40
  
  Private Declare Sub SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)
  Private Declare Function GetForegroundWindow Lib "user32" () As Long
  Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
  Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
  
  Dim s1, s2 As Long
  Private Sub Form_Activate()
  SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
  End Sub
  Private Sub Timer1_Timer()
  s1 = GetForegroundWindow
  If s1 <> Me.hwnd Then s2 = s1
  End Sub
  Private Sub Command1_Click()
  SetForegroundWindow s2
  keybd_event 65, 0, 0, 0
  End Sub
这段代码可以在WORD、记事本输入(模拟屏幕键盘),但是在IE网页上无法输入(WWW.163.NET 用户名与密码栏其他网站的只要有用户名与密码的网页都无法输入,有时候可以输入一个字,如果要用光标转到地址栏输入再转到用户名那栏就无法输入),不知道为什么,是不是网页的输入框没有句柄,还是别的原因,请高手们解决!!!
http://community.csdn.net/Expert/topic/3108/3108405.xml?temp=2.662295E-02(之前有提过,但是还是没有解决)

解决方案 »

  1.   

    我看关键是怎么让输入框获得焦点,只要有焦点,用sendkeys就可以输入啦,不用这么麻烦
      

  2.   

    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    在这里可以啊
      

  3.   

    请各位高手在IE的输入框试看看就知道了,我试了N次了。目前还没有找到怎样在IE里获取焦点的方法有高手说IE网页中的文本框是封装在Internet Explorer_Server里的,所以不能进入。
    请你们都试一下.类似163的用户名与密码框。
      

  4.   

    在我这可以
    我把timer该为
       Private Sub Timer1_Timer()
        s1 = GetForegroundWindow
        If s1 <> Me.hwnd Then
        s2 = s1
        SetForegroundWindow s2
        keybd_event 65, 0, 0, 0
        End If
        End Sub
      

  5.   

    sendkeys可以向任何有输入焦点的控件输入,你想要的好像是自动向IE页面输入内容(事先不需要用户手动给输入框焦点,这用sendkeys就不行了,用keybd_event是一样的,都需要先有焦点才行
      

  6.   

    我记得以前那里看到说IE的属于COM什么的,你用EnumChildWindow试试看,然后再配合keybd_event,SendKeys是无能为力了。
      

  7.   

    //不知道为什么,是不是网页的输入框没有句柄,还是别的原因,请高手们解决!!!网页的输入框一般都没有句柄,不过这不是关键,关键是你的屏幕键盘的窗体要具有WS_DISABLED风格,这样才不会转移输入焦点,当然,这样一来对事件的处理就麻烦了,看你api的功力了
      

  8.   

    //是不是VB开发这个键盘很难,那么像那么输入法的键盘是用什么语言写出来的,大概的原理是什么呀?难倒是不难,不过也不能说很容易,建议你先把api学好
      

  9.   

    笨笨的方法:用 sendkeys 发送 tab 键让文本框得到焦点,然后再 sendkeys 或 key_event
      

  10.   

    问题的关键是:在点击你的屏幕键盘的时候,不能转移输入焦点
    在win2000以上的操作系统中window增加了一条附加窗口风格WS_EX_NOACTIVATE,他可以完全满足你的要求,可以作为一条捷径:作为测试,窗体上只有一个按钮:
    Option Explicit
    Private Const GWL_STYLE = (-16)
    Private Const HWND_TOPMOST = -1
    Private Const HWND_NOTOPMOST = -2
    Private Const SWP_NOSIZE = &H1
    Private Const SWP_NOMOVE = &H2
    Private Const SWP_NOACTIVATE = &H10
    Private Const SWP_SHOWWINDOW = &H40
    Private Const WS_EX_NOACTIVATE = &H8000000
    Private Const GWL_EXSTYLE = (-20)
    Private Declare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Sub SetWindowPos Lib "User32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long)Private Sub Command1_Click()
    SendKeys "哈哈"
    End SubPrivate Sub Form_Load()
        Dim style As Long
        style = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
        style = style Or WS_EX_NOACTIVATE
        Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, style)
        SetWindowPos Me.hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_SHOWWINDOW Or SWP_NOMOVE Or SWP_NOSIZE
    End Sub这段代码的缺点是标题栏始终是灰突突的,很不好看,这可以通过自绘标题栏解决至于2000以下的操作系统,这段代码则不能很好的运行,只好老老实实的写代码了
      

  11.   

    rainstormmaster(暴风雨 v2.0) 真是高手,我在WIN2000的系统测试均可以实现,但是就是WIN98不行,不过还是很感谢你!