关于鼠标弹出右键菜单的有关问题
关于鼠标弹出右键菜单的问题?
我的一个输入法,我在程序中设置了:在它的窗口范围内击一下鼠标右键,会弹出右键菜单。
但是由于输入法的窗口都有CS_IME风格,所以它是收不到鼠标消息的,作为替代,我是处理WM_SETCURSOR消息,然后再用GetCursorPos获取当前鼠标位置,我是这样写的:
可是我发现:如果设置TPM_BOTTOMALIGN,让菜单在鼠标右上方弹出,会出现一个奇怪的现象:就是一点击右键,菜单确实会出现,但闪烁不止,就好象一直不断的弹出一样。
如果不设这个参数,让它默认在右下方弹出,通常情况下一切正常,菜单可以正常弹出。但是当位置位于屏幕下方,这时下方的位置已经不够弹出菜单的,这时windows会自己将菜单移到右上方,这时又会出现上面所说的闪烁不止的现象。
调试发现:出现闪烁的时候,不断收到WM_SETCURSOR消息,且HIWORD(lParam) == WM_RBUTTONDOWN,这当然会导致菜单不断弹出了。可是为什么菜单在右上方弹出的时候,会不断收到WM_SETCURSOR消息呢?
求解。
------解决方案--------------------
有个退一步的蠢方法:WM_SETCURSOR消息响应函数内判断菜单是否弹出
------解决方案--------------------
你能否HOOK WH_MOUSE_LL判断鼠标鼠标右键是否点在你输入法窗口上PtInRect() ?
我的一个输入法,我在程序中设置了:在它的窗口范围内击一下鼠标右键,会弹出右键菜单。
但是由于输入法的窗口都有CS_IME风格,所以它是收不到鼠标消息的,作为替代,我是处理WM_SETCURSOR消息,然后再用GetCursorPos获取当前鼠标位置,我是这样写的:
case WM_SETCURSOR:
if(HIWORD(lParam) == WM_LBUTTONDOWN)
{
goto LButtonDown;
}
else if(HIWORD(lParam) == WM_MOUSEMOVE)
{
goto LButtonMove;
}
else if(HIWORD(lParam) == WM_LBUTTONUP)
{
goto LButtonUp;
}
else if(HIWORD(lParam) == WM_RBUTTONDOWN)//鼠标右键
{
GetCursorPos(&ptScreen);
TrackPopupMenu(hMenuSet, TPM_BOTTOMALIGN, ptScreen.x, ptScreen.y, 0, hWnd, NULL);
}
可是我发现:如果设置TPM_BOTTOMALIGN,让菜单在鼠标右上方弹出,会出现一个奇怪的现象:就是一点击右键,菜单确实会出现,但闪烁不止,就好象一直不断的弹出一样。
如果不设这个参数,让它默认在右下方弹出,通常情况下一切正常,菜单可以正常弹出。但是当位置位于屏幕下方,这时下方的位置已经不够弹出菜单的,这时windows会自己将菜单移到右上方,这时又会出现上面所说的闪烁不止的现象。
调试发现:出现闪烁的时候,不断收到WM_SETCURSOR消息,且HIWORD(lParam) == WM_RBUTTONDOWN,这当然会导致菜单不断弹出了。可是为什么菜单在右上方弹出的时候,会不断收到WM_SETCURSOR消息呢?
求解。
------解决方案--------------------
有个退一步的蠢方法:WM_SETCURSOR消息响应函数内判断菜单是否弹出
------解决方案--------------------
你能否HOOK WH_MOUSE_LL判断鼠标鼠标右键是否点在你输入法窗口上PtInRect() ?