比如在让程序自动点击QQ的"上线","隐身"项。谢谢!

解决方案 »

  1.   

    1. 区分一个窗口是不是按钮
    CHAR szClassName[32];
    int rn = GetClassName(hwnd, szClassName, sizeof(szClassName) - 1);
    if(rn > 0) 
    {
    else if(lstrcmpi(szClassName, "Button") == 0)
    {
    ......
    }
    }
    2.
    发消息给按钮来调用按钮相对应的函数
    ::PostMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
    ::SendMessage(m_hWnd,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
      

  2.   

    沒有這樣做過,但我想應該可以通過FindWindow找到主窗口,再用GetWindow(m_hWnd, GW_CHILD);GetWindow(hWndChild, GW_HWNDNEXT);遍歷各子窗口
    還可以用GetDlgItem(hWndChild, nID)找到各控件, GetClassName(hWndSun, szClassName, sizeof(szClassName))確定你要找的按鈕,postmessage給它
      

  3.   

    我看看,如果按钮在系统图标区,刚GetClassName()取回的是"toolbarwindows32",按下是一个弹出式菜单,ClassName是"#3372",请问我怎么让程序自动按下弹出菜单的某一项(比如第一项):)
      

  4.   

    HWND hwndParent = ::FindWindow( NULL, "对话模式" );//查找对话框句柄
    if(hwndParent==NULL)
    return;
    HWND hwndPasswd = ::FindWindowEx( hwndParent, NULL, "Edit", NULL );//查找EDIT句柄
    if(hwndParent==NULL)
    return;
    if(::GetForegroundWindow()!=hwndParent)
    ::SetForegroundWindow( hwndParent );
         ::SetFocus( hwndPasswd ); CString Message;
    Message=m_sArray.GetAt(count%m_sArray.GetSize());
    ::SendMessage(hwndPasswd, WM_SETTEXT, Message.GetLength(), (LPARAM)Message.GetBuffer(Message.GetLength()));
    keybd_event(VK_MENU,0,0,0); //按下alt 
    keybd_event(83,0,0,0); //按下s
    keybd_event(83,0,2,0); //释放s 
    keybd_event(VK_MENU,0,2,0); //释放alt 
    count++;
    memset(count1,0,10);
    itoa(count,count1,10);
    GetDlgItem(IDC_COUNT)->SetWindowText(count1);
      

  5.   

    谢谢 wltsui(你跳,我也跳!) 
    你帖的是一个自动猜密码的程序段,我要一个模拟鼠标点弹出式菜单的程序:
    先点一个button,button会弹出一个popmenu,然后点popmenu上的一个菜单项。
    大家来看看呀。。谢谢 wistaria(听风听雨) ,你的程序段我用了,PostMessage没什么动静,是不是我写得不得?我是在鼠标钩子里调用的。请看:
    hButton是鼠标所在处的HWND。
    CHAR szClassName[32];
    int rn = GetClassName(hButton, szClassName, sizeof(szClassName) - 1);
    if(rn > 0) 
    {
    if(lstrcmpi(szClassName, "button") == 0)
    {
    ::PostMessage(hButton,WM_COMMAND,MAKEWPARAM(IDOK,BN_CLICKED),0);
    }
    else{
    strcpy(lp,szClassName);
    TextOut(hdc,10,150,lp,strlen(lp));
    }
      

  6.   

    ::SetCursorPos(int X , int Y)    函数功能:该函数综合鼠标击键和鼠标动作。    函数原型:VOID mouse_event(DWORD dwFlags,DWORD dx,DWORD dwFlags,OWORD dx,DWORD dy, DWORD dwData, DWORD dwExtralnfo);    参数:    dwFlags:标志位集,指定点击按钮和鼠标动作的多种情况。此参数里的各位可以是下列值的任何合理组合:    MOOSE_EVENTF_ABSOLOTE:表明参数dX,dy含有规范化的绝对坐标。如果不设置此位,参数含有相对数据:相对于上次位置的改动位置。此标志可被设置,也可不设置,不管鼠标的类型或与系统相连的类似于鼠标的设备的类型如何。要得到关于相对鼠标动作的信息,参见下面备注部分。    MOOSEEVENTFMOVE:表明发生移动。    M00SEEVENTF_LEFTDOWN:表明接按下鼠标左键。    M00SEEVENTF_LEFTUP:表明松开鼠标左键。    MOOSEEVENTF_RIGHTDOWN:表明按下鼠标右键。    MOOSEEVENTF_RIGHTUP:表明松开鼠标右键。    MOOSEEVENTF_MIDDLEDOWN:表明按下鼠标中键。    MOOSEEVENTF_MIDDLEUP:表明松开鼠标中键。    MOOSEEVENTF_WHEEL:在Windows NT中如果鼠标有一个轮,表明鼠标轮被移动。移动的数量由dwData给出。    dx:指定鼠标沿x轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLOTE的设置。给出的绝对数据作为鼠标的实际X坐标;给出的相对数据作为移动的mickeys数。一个mickey表示鼠标移动的数量,表明鼠标已经移动。    dy:指定鼠标沿y轴的绝对位置或者从上次鼠标事件产生以来移动的数量,依赖于MOOSEEVENTF_ABSOLVTE的设置。给出的绝对数据作为鼠标的实际y坐标,给出的相对数据作为移动的mickeys数。    dwData:如果dwFlags为MOOSEEVENTF_WHEEL,则dwData指定鼠标轮移动的数量。正值表明鼠标轮向前转动,即远离用户的方向;负值表明鼠标轮向后转动,即朝向用户。一个轮击定义为WHEEL_DELTA,即120。    如果dwFlagsS不是MOOSEEVENTF_WHEEL,则dWData应为零。    dwExtralnfo:指定与鼠标事件相关的附加32位值。应用程序调用函数GetMessgeExtrajnfo来获得此附加信息。    返回值:无。    备注:如果鼠标被移动,用设置MOUSEEVENTF_MOVE来表明,dX和dy保留移动的信息。给出的信息是绝对或相对整数值。    如果指定了MOWSEEVENTF_ABSOLOTE值,则dX和dy含有标准化的绝对坐标,其值在0到65535之间。事件程序将此坐标映射到显示表面。坐标(0,0)映射到显示表面的左上角,(6553,65535)映射到右下角。    如果没指定MOWSEEVENTF_ABSOLOTE,dX和dy表示相对于上次鼠标事件产生的位置(即上次报告的位置)的移动。正值表示鼠标向右(或下)移动;负值表示鼠标向左(或上)移动。    鼠标的相对移动服从鼠标速度和加速度等级的设置,一个最终用户用鼠标控制面板应用程序来设置这些值,应用程序用函数SystemParameterslnfo来取得和设置这些值。    在应用加速时系统对指定相对鼠标移动提供了两个测试。如果指定的沿X轴y轴的距离比第一个鼠标阈值大,并且鼠标的加速等级非零,则操作系统将距离加倍。如果指定的沿X轴或y轴的距离比第二个鼠标阈值大,并且鼠标的加速等级为2,则操作系统将从第一个阈测试得来的距离加倍。这样就允许操作系统将指定鼠标沿X轴或y轴的相对位移加到4倍。    一旦应用了加速,系统用期望的鼠标速度换算合成的值。鼠标速度的范围是从1(最慢)到20(最快),并代表基于鼠标移动的距离指示符移动的数量。缺省值是10,表示对鼠标的移动设有附加的修改。    函数mouse_event需要用的应用程序用来合成鼠标事件。也被应用程序用来取得鼠标位置和鼠标按键状态之外的鼠标信息。例如,如果输入板制造商想将基于画笔的信息传给自己的应用程序,可以写一个直接与输入板硬件通信的动态键接库(DLL),获得附加的信息,并保存到一个队列中。DLL然后调用mouse_event,用标准按键和x/y位置数据,并在参数dwExtralnfo设置排列的附加信息的指针或索引。当应用程序需要附加信息时,调用DLL(连同存贮在dwEXtralnfo中的指针或索引),则DLL返回附加信息。    Windows CE:Windows CE不支持参数 dwFlags取MOOSE EVENTF WHEEL常数。
      

  7.   

    谢谢 gularess(无吃哪拉) 
    你说得很好,在pcanywhere这样的软件里用mouse_event和keybd_event在服务端模拟鼠标和键盘。在本机,通过它们实现我要的功能有点大材小用,呵呵。我想通过消息来实现,
    大家告诉一个小弟:单击popmenu的一个菜单项的消息是什么?参数怎么设置?
    帮帮手了,,,,
      

  8.   

    消息名称是:WM_COMMAND,
    wParam 是菜单的ID 值,你需要用ResourceHacker之类的工具去察看具体的值。
    lParam 是产生的来源,具体是什么意义你去查MSDN。