就是给一个窗口发送 按下TAB 键的消息就是 跟 用户按下TAB 的效果一样具体点就是假设一个基本对话框
上面有4个按钮如果是用户按下TAB 键的效果 就是
用户按一次 焦点就往下一个按钮现在用
void CTestDlg::OnButton1()//点击第一个按钮 焦点转到下一个 (窗口句柄是当前自己程序的句柄)

 PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);//这代码藐视没用 我试了N次 效果都不是 用户按下TAB键的效果
}要求用PostMessage 或者SendMessage 实现
说白了 就是点击第一个按钮 焦点跑到第二个按钮 再点击第一个按钮 焦点到 第三个按钮

解决方案 »

  1.   

    SetFocus(HWND hWnd)应该可以。不用你这么麻烦
      

  2.   

    1楼 要求用PostMessage 或者SendMessage 实现
      

  3.   

    这么晚还不睡,
    我试了很长时间也没解决,但是有一点可以肯定:
    PostMessage绝对是触发了,也许是发送的消息不对,
    有个默认按钮还有个焦点按钮,这两个可以同时存在于任何按钮上。
      

  4.   

    PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);//
    ==========
    一次按键有两次消息:
    PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);//
    PostMessage(WM_KEYUP,(WPARAM)VK_TAB,NULL);//
      

  5.   

    另外还有一个可能,就是参数lParam设为NULL不一定行,lParam 第0~15位是表示键重复的次数,第16~23位是键的 Scan Code,组合键需要设置第24位。我觉得在第16~23位的 Scan Code 要用API:MapVirtualKey来获取才行。
      

  6.   

    在资源视图属性中,勾上Tab Stop就行了,按ctrl + D调整顺序吧!
      

  7.   

    11楼 我想你误会意思了是用发送消息 实现 跟按下TAB 键一样的效果
      

  8.   

    我觉得你得思路是有问题的
    先不说你用的方法好不好用
    假设PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);可以成功
    那么我们看看你的程序会发生什么你单击Button1的时候会触发消息
    注意这个时候Button1一定拥有了焦点的
    而在OnButton1里发送消息
    这样焦点就会移动到Button1的下一个tab位置
    所以你不断地单击Button1即便PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);好用也就不过是不断地将焦点移动到Button1的下一个tab位置
      

  9.   

    15 楼.....
    问题是 PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);
    没任何反应
      

  10.   

    我讨论的不是PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);有没有反映
      

  11.   

    15 楼
    PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);
    根本就不往下移动
      

  12.   

    有没有什么好的办法 发送按下TAB消息?  
      

  13.   

    楼主的错误在于:光想发送消息,不想处理消息
    不想处理消息,就只能用缺省的处理方法
    而缺省的方法本来就是那样处理的,然后大呼,为什么不按我想的做呢?首先你点击按钮1按系统缺省的方式就是让TAB的ID又回到了按钮1
    不管你咋点,他都从你点的地方开始算
    如果要达到你的要求,就必须重新处理TAB的响应
    第一步: 建立变量itemID代替TAB处理的默认的ID;WORD itemID=0;
    第一步:在对话框上连续建立10个按钮,并消除"制表"前面的勾
    第二步:重新处理TAB键
    BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
    {
        if((pMsg->message==WM_KEYDOWN)&&(pMsg-> wParam==VK_TAB))
        {
    if(itemID==0) itemID=IDC_BUTTON1;
    itemID++;
    if(itemID>IDC_BUTTON10) itemID=IDC_BUTTON1;
    GetDlgItem(itemID)->SetFocus();
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    第四步:响应按钮1
    void CTestDlg::OnButton1() 
    {
        PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);
    }
      

  14.   

    于是,转了一圈回来,你就发现
    所谓的
    必须用PostMessage 或者SendMessage 来实现
    其实是你想当然的一个无聊的试验因为消息主要是用来处理窗口之间的问题
    而窗口之内,都是直接调用的就和1楼说的一样
      

  15.   

    22楼 thank you 或许我的方法就错了
      

  16.   

    等等 又想了下
    发送 按下 A  B C D 之类的 程序都能响应....
      

  17.   


    id不是有规律的,你就傻眼了??????????????????
    你不会建立一个数组吗?WORD   mList[10]={IDC_BUTTON1,IDC_BUTTON2.....IDC_BUTTON10}
    WORD   itemID=0;itemID++;
    if(itemID>=10) itemID=0GetDlgItem(mList[itemID]).....这是问题吗?