有个程序在机器启动之后会自动运行,但是需要输入密码,如果是人操作的话,就要先激活窗口,然后按alt+l(L键,不是数字1)弹出菜单,再按回车或者l(L键,不是数字1)键弹出密码输入框,输入密码1234,再回车确定,OK。
    我现在要写个程序,把人工操作的部分用程序来完成
1,根据窗口标题取得窗口句柄(这个已经可以实现)
2,激活窗口,这个也可以实现,但是窗口不会打开再桌面上,只是在任务栏上面凹下去了
3,发送alt+l消息
4,发送回车消息
5,一次发送1,2,3,4消息
6,发送回车消息程序代码如下,但是密码总也输入不了,请高手给看看什么问题,谢谢!        HWND hd=::FindWindow(0,"程控交换机管理系统CDX-PBX V300");
  
if   (hd   !=   NULL)   
{   
::SetForegroundWindow(hd); 
::SendMessage(hd,WM_SYSCOMMAND,SC_KEYMENU,(WPARAM)0x4c);
::SendMessage(hd,WM_CHAR,13,0);
::SendMessage(hd,WM_CHAR,49,0);
::SendMessage(hd,WM_CHAR,50,0);
::SendMessage(hd,WM_CHAR,51,0);
::SendMessage(hd,WM_CHAR,52,0);
::SendMessage(hd,WM_CHAR,13,0);
        }  

解决方案 »

  1.   

    还要FindWindowEx取得输入框的句柄呀
      

  2.   

    窗体不是自己的,SendMessage会没用吧......
      

  3.   

    采用发送消息的方式实现进程间通信必须要采用WM_COPYDATA,现在的问题是你不能改动别人的程序,因此在那个程序里不能实现WM_COPYDATA消息的实现函数,因此基本上你做不了。发送标准的Windows消息,但不传送数据的话应该是不需要修改对方程序的,但你的要求显然不只是发送标准的Windows消息。
      

  4.   

    我要实现模拟击键的功能,后来在网上找到keybd_event()这个函数,这个函数不是向窗口发送消息,而是向操作系统发送一个击键消息,这正好满足我的功能需求。代码写在下面,可能有的朋友会用到::SetForegroundWindow(hd1); //将窗口激活置顶,方便接受键盘消息
    Sleep(1000);                //延时一秒,程序启动有反应时间,所以加个延时
    ::PostMessage(hd1,WM_SYSKEYDOWN,0x4c,1<<29);//向窗口发送alt+l消息打开菜单的下拉列表
    Sleep(1000);              //同上面的延时
    keybd_event(VK_RETURN,0,0,0);//回车
    Sleep(1000);              //同上面的延时
    keybd_event('1',0,0,0);   //模拟击键“1”
    keybd_event('2',0,0,0);   //...
    keybd_event('3',0,0,0);   //...
    keybd_event('4',0,0,0);   //...keybd_event(VK_RETURN,0,0,0);//模拟击键回车功能很简单,就是一个自动的登陆器。另外,我对大家的热情关注和各种解答表示由衷的感谢,分不多,聊表心意。