功能描述如下: 
已有独立的EXE程序A(窗体名为Test),界面包括两个EDIT Contorl和一个Button,现在想写一个程序B实现对EDIT Control的自动输入和Button的自动点击。 我现在的方案是通过SendMessage实现对外部程序的控制,但是遇到了一些麻烦。 
B程序的代码为 
HWND hWnd  = ::FindWindow(NULL,"Test"); 
::SetForegroundWindow(hWnd); 
HWND eWnd = ::GetFocus();//Test程序中的默认的Focus在第一个EDIT Control上 
::SetWindowText(eWnd,"19"); 
::PostMessage(hWnd,WM_KEYDOWN,VK_TAB,0);//通过Tab将较低移动到第二个EDIT Control上 
eWnd = ::GetFocus(); 
::SetWindowText(eWnd,"20"); 
不知如何,执行程序B可以获得Test的句柄和活激活Test的窗口,但是对EDIT Contorl的操作失败。 
另外,是否有更好的方法,直接获得外部程序任意EDIT Control的句柄 谢谢!!!

解决方案 »

  1.   

    本帖最后由 happyparrot 于 2009-11-06 13:41:10 编辑
      

  2.   

    在其他进程中使用GetFocus 
    http://blog.csdn.net/jinhaijian/archive/2008/04/19/2305989.aspx
      

  3.   

    ::SetWindowText(eWnd,"20"); 
    用这个函数不对吧?
    模拟键盘事件不知道可不可以keybd_event
      

  4.   


    mouse_event或kyboard_even模拟鼠标和键盘事件。
    关键是要取得EDIT的正确位置。
      

  5.   

    你直接通过FindWindow找它就行了吧。你先用SPY看看classname 和标题实在不行用 EnumWindow和EnumChildWindow
      

  6.   

    估计发送的消息其他程序并不一定会按你要求处理
    SendInput可以模拟鼠标,键盘等操作来点击
      

  7.   

    先用FindWindow得到窗口句柄,再FindWindowEx等方法获得Edit空间句柄,用SendMessage向其发WM_SETTEXT消息设置文字字符串,再用SendMessage向窗口发WM_COMMAND消息模拟点击按钮(wParam低16位为按钮ID,高16位为BN_CLICKED)。
      

  8.   

            HWND hwnd=::FindWindow(NULL,"Test");
    ::SetForegroundWindow(hwnd);
    HWND hedit=::FindWindowEx(hwnd,NULL,"EDIT",NULL);
    char   a[10],b[10]; 
    strcpy(a,_T( "19 ")); 
    strcpy(b,_T( "20 ")); 
    ::SendMessage(hedit,   WM_SETTEXT,   0,   (LPARAM)a);     
    //::PostMessage(hEditBox,   WM_SETTEXT,   0,   (LPARAM)a);    
    HWND hedit2=::FindWindowEx(hwnd,hedit,"EDIT",NULL);
    ::SendMessage(hedit2,   WM_SETTEXT,   0,   (LPARAM)b);    
    HWND hedit3=::FindWindowEx(hwnd,hedit2,"BUTTON","btn");
    ::SendMessage(hedit3,WM_LBUTTONDOWN,0,0);   
    ::SendMessage(hedit3,WM_LBUTTONUP,0,0); 
    测试了一下 可行
      

  9.   

    确实可以实现,多谢!
    还是对FindWindowEx函数的理解不够哦~~
      

  10.   

    如果点击按钮后程序A弹出对话框(窗体名为"TEST_NOTIFY"),对话框中有一确定按钮,我在上面代码的基础上添加如下代码如何不能实现自动点击确认按钮呢?
    ::SendMessage(hedit2,  WM_SETTEXT,  0,  (LPARAM)b);    
    HWND hDlg = ::FindWindowEx(hwnd,hedit3,NULL,"TEST_NOTIFY");
    HWND hBtn = ::FindWindowEx(hDlg ,NULL,,"BUTTON","确定"); 
    ::SendMessage(hBtn ,WM_LBUTTONDOWN,0,0);  
    ::SendMessage(hBtn ,WM_LBUTTONUP,0,0); 单步调试发现执行
    ::SendMessage(hedit3,WM_LBUTTONDOWN,0,0);  
    ::SendMessage(hedit3,WM_LBUTTONUP,0,0); 
    后窗体名为"TEST_NOTIFY"的对话框并未弹出,导致 hDlg 句柄未能正确捕获。请指教~谢谢
      

  11.   

    关键是要用WM_SETTEXT这个消息,因为你是在B进程里分配的显示字符串缓冲区,这个指针传给A进程肯定没有意义,而WM_SETTEXT消息,系统会做一些后台处理,用共享映像文件来解决这个问题,你只需向目标窗口发送这个消息即可