就是给一个窗口发送 按下TAB 键的消息就是 跟 用户按下TAB 的效果一样具体点就是假设一个基本对话框
上面有4个按钮如果是用户按下TAB 键的效果 就是
用户按一次 焦点就往下一个按钮现在用
void CTestDlg::OnButton1()//点击第一个按钮 焦点转到下一个 (窗口句柄是当前自己程序的句柄)
{
PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);//这代码藐视没用 我试了N次 效果都不是 用户按下TAB键的效果
}要求用PostMessage 或者SendMessage 实现
说白了 就是点击第一个按钮 焦点跑到第二个按钮 再点击第一个按钮 焦点到 第三个按钮
上面有4个按钮如果是用户按下TAB 键的效果 就是
用户按一次 焦点就往下一个按钮现在用
void CTestDlg::OnButton1()//点击第一个按钮 焦点转到下一个 (窗口句柄是当前自己程序的句柄)
{
PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);//这代码藐视没用 我试了N次 效果都不是 用户按下TAB键的效果
}要求用PostMessage 或者SendMessage 实现
说白了 就是点击第一个按钮 焦点跑到第二个按钮 再点击第一个按钮 焦点到 第三个按钮
我试了很长时间也没解决,但是有一点可以肯定:
PostMessage绝对是触发了,也许是发送的消息不对,
有个默认按钮还有个焦点按钮,这两个可以同时存在于任何按钮上。
==========
一次按键有两次消息:
PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);//
PostMessage(WM_KEYUP,(WPARAM)VK_TAB,NULL);//
先不说你用的方法好不好用
假设PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);可以成功
那么我们看看你的程序会发生什么你单击Button1的时候会触发消息
注意这个时候Button1一定拥有了焦点的
而在OnButton1里发送消息
这样焦点就会移动到Button1的下一个tab位置
所以你不断地单击Button1即便PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);好用也就不过是不断地将焦点移动到Button1的下一个tab位置
问题是 PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);
没任何反应
PostMessage(WM_KEYDOWN,(WPARAM)VK_TAB,NULL);
根本就不往下移动
不想处理消息,就只能用缺省的处理方法
而缺省的方法本来就是那样处理的,然后大呼,为什么不按我想的做呢?首先你点击按钮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);
}
所谓的
必须用PostMessage 或者SendMessage 来实现
其实是你想当然的一个无聊的试验因为消息主要是用来处理窗口之间的问题
而窗口之内,都是直接调用的就和1楼说的一样
发送 按下 A B C D 之类的 程序都能响应....
id不是有规律的,你就傻眼了??????????????????
你不会建立一个数组吗?WORD mList[10]={IDC_BUTTON1,IDC_BUTTON2.....IDC_BUTTON10}
WORD itemID=0;itemID++;
if(itemID>=10) itemID=0GetDlgItem(mList[itemID]).....这是问题吗?