问题描述:
VC++中可以识别按钮的长按与短按吗?网上有人用下面代码实现了~可我却调试不好~期待高手指点~网上的代码是这样的:
从CButton派生个类,在WM_LBUTTONDOWN的时候记下时间,在WM_LBUTTONUP的时候再记一下。
然后,在按钮处理函数里判断时延。
如:
TButton.h
class CTButton : public CButton
{
public:
CTButton()
DWORD st, ed
protected:
{{AFX_MSG(CTButton)
afx_msg void OnLButtonDown(UINT nFlags, CPoint point)
afx_msg void OnLButtonUp(UINT nFlags, CPoint point)
}}AFX_MSG
......
}
TButton.cpp
void CTButton::OnLButtonDown(UINT nFlags, CPoint point)
{
st = GetTickCount()
CButton::OnLButtonDown(nFlags, point)
}
void CTButton::OnLButtonUp(UINT nFlags, CPoint point)
{
ed = GetTickCount()
CButton::OnLButtonUp(nFlags, point)
}
dlg.cpp
void CSdaDlg::OnButton1()
{
if(m_bt.ed - m_bt.st <2000) 可以把判断孙链写成CTButton的函数
{
AfxMessageBox("short"蚂凯腊)
}
else
{
AfxMessageBox("long")
}
}
解析:
程序我看过了 写的逻辑上没错 也没有明显的语法错误 你如果调试不错 把错误帖上来 别人才好帮你
原程序用的是 ButtonUp 触发的发送消息
你可以在ButtonDown 的时触发一个SetTimer
2秒后触发消息就行了
可以的用Keyevent这个函数来实现,就是写一个循环来调用Keyevent是某一个键不停销滚的被按下,释销斗陵放。VOID keybd_event( BYTEbVk, BYTEbScan, DWORDdwFlags, DWORDdwExtraInfo)
Windows提供了一个模拟键盘API函数Keybd_event(),使用该函数可以相应的屏蔽键盘的动作。Keybd_event()函数能触发一个按键事件,也就是说会产生一个WM_KEYDOWN或WM_KEYUP消息。
该函数原型如下:
VOID keybd_event(
BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
)
从原型可以看出,Keybd_event()共有四个参数:
第一个为按键的虚拟键值,如回车键为vk_return, tab键为vk_tab(其他具体的参见附录:常用模拟键的键值对照表);
第二个参数为扫描码,一般不用设置,用0代替就行;
第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";
第四个参数一般也是置0即可。
例子1:模拟按下'A'键
keybd_event(65,0,0,0)
keybd_event(65,0,KEYEVENTF_KEYUP,0)
例子2:模拟按下'亏戚ALT+F4'键
keybd_event(18,0,0,0)
keybd_event(115,0,0,0)
keybd_event(115,0,KEYEVENTF_KEYUP,0)
keybd_event(18,0,KEYEVENTF_KEYUP,0)
WM_LBUTTONDOWN 如果亩衫你用消息 可以根据电判断如瞎耐塌果是MFC
建议重磨圆写PreTranslateMessage
BOOL CXXXXXDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_LBUTTONDOWN)
{
if(pMsg->hwnd == ((CWnd*)GetDlgItem(IDC_BTDOME_01))->m_hWnd)
处理;
}}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)