安装CBT钩子后,监控另一个应用程序,只要另一个应用程序打开一个窗口,
就找到其中一个文本框,往里面写入数据.
现在的问题是:有个别的窗口第一次没有效果,点一下别的窗口再点该程序就可以.
不知是为什么?
// 钩子回调
function CBTHookProc(nCode: integer; wParam: wParam; LParam: LParam): LRESULT; stdcall;
var
  Dialog: HWND;
  buffer: array[0..255] of char;
begin
  Result := 0;
  if nCode < 0 then
  begin
    Result := CallNextHookEx(aHook, nCode, wParam, LParam);
    Exit;
  end
  else
  begin
    case nCode of
      HCBT_ACTIVATE:
        begin
          Dialog := HWND(wParam);
         // 约束条件
          GetClassName(Dialog, buffer, 255);
          if buffer = 'TSubForm' then
          begin
            SetLength(HandleList, 0);
            EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog));           //找到控件handle后填充数据
            SendMessage(HandleList[3], WM_SETTEXT, 0, Longint(PChar('哈哈哈哈萨克')));
          end;
        end;
    end;
  end;
end;

解决方案 »

  1.   


                EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog));
                
                SetLength(HandleList, 0); 
                EnumChildWindows(Dialog, @EnumChildWindowsProc, Longint(@Dialog));             Application.MessageBox('执行了!', '提示');           //找到控件handle后填充数据 
                 SendMessage(HandleList[3], WM_SETTEXT, 0, Longint(PChar('哈哈哈哈萨克'))); 能正常弹出提示,但就是看不到效果.只有重新获得一次焦点才可以.
    不使用dll的话有效果.
      

  2.   

    补充一下:TSubForm已存在,第一次时没效果
    如果是新建TSubForm就可以
      

  3.   

    HCBT_ACTIVATE
    本身就是激活的状态不会收到这个消息吧
    点下别的窗口再点回来就触发了
      

  4.   

    本身已经是焦点的话,那是无效的……
    直接做到EXE里面去吧……
      

  5.   

    开始时是别的窗口有焦点啊
    点击一个按钮才调出隐藏的SubForm来
    这个过程应该会有激活的消息吧