我想发送几个按键消息到当前具有输入焦点的编辑控件中,应如何实现?
如果我用GetForegroundWindow找到当前前景窗体后,往这个窗体发送按键消息,窗体却无响应消息。根据Spy++探测我发过去的消息所知,这个窗体虽然收到了消息,但是具体接受按键消息的并不是该窗体,而是窗体里面的获有焦点的控件。
可能大家还不太明白我的意思,举个例子,像我要发送消息到记事本里面,我找到了记事本这个窗体,但我发送"s"按键消息给这个窗体时,记事本并没有显示我发送过去的按键"s",因为真正要获取按键的并不是这个窗体,而是这个窗体里的一个EDIT控件。如果说我继续往里查找这个EDIT控件虽然可以实现消息发送,但是我并不是针对记事本一个软件,我是想要做一个通用型的,当前哪个控件具有键盘输入特性,我就发送到哪个控件当中

解决方案 »

  1.   

    如果是自己的程序还说可以用form.activecontrol.handle,但并不是自己的程序啊,是其它软件
      

  2.   

    h1 = ::FindWindow(NULL, "ShowAllProcess"); // 找到当前活动主窗口
    h2 = ::FindWindowEx(h1, NULL,  "Edit", NULL);
      if ( h2 <> NULL)
      {
         ::SendMessage(h2, WM_SETTEXT, 255, (LPARAM)"AAAA");
      }
    // 这个h2就是 这个接收消息的句柄 
    // 上面代码为VC代码 经测试可以运行 DELPHI也差不多。。
      

  3.   

    你可以先用FINDWINDOW(NIL,你想操作的窗口标题)得到句柄与GetActiveWindow得到的句柄比较,如果相等,那么说明你想操作的窗口处于激活状态。这时再GetFocus得到有输入焦点的控件的句柄。然后就可以用KEYBD-EVENT对这个控件进行操作了。
      

  4.   

    GetFocus无法取得输入焦点啊,取得的HWND为0
      

  5.   

    那是输入框没得到焦点。呵呵
    只有遍历控件类名来找输入框了。VC的是EDIT,DELPHI的是TEDIT,VB的是ThunderRT6TextBox。找到这样的控件,就往里发消息吧。得到主窗体的句柄后用AAA=GetWindow(句柄, GW_CHILD)取得第1个控件的句柄,加循环While AAA > 0 DO,GETCLASSNAME取类名,最后 AAA=GetWindow(AAA, GW_HWNDNEXT) ,结束循环。基本没什么问题了。
      

  6.   

    但问题在于,我遍历所有控件时,怎么知道哪个控件才是我要输入的EDIT呢?例如说那个软件两个EDIT控件,我又怎么知道哪个才是正在输入的EDIT控件呢?
      

  7.   

    不是说了么,正在输入的EDIT控件句柄就是GetFocus得到的那个么。如果=0的话,就是哪个也没有得到焦点,这时再遍历。取第1个。说了让你结合起来用。
      

  8.   

    如果你用循环或者TIMER控件来做,只要GetFocus就可以了。每个输入框只要有焦点,也就是有人想在里面输入东西的话,你就会知道了。