• ActiveX控件在IE中不响应Backspace消息


    1、操作输入法需要导入:
    #include <imm.h>
    #pragma comment(lib, "imm32")

    2、定义变量:
    //键盘钩子句柄
    HHOOK g_hKeyboardHook = NULL;
    //是否拦截Backspace
    bool g_bInterceptBackspace = true;
    

     3、定义键盘钩子回调函数:

    LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if (nCode > -1)
    	{
    		BOOL bRet = FALSE;
    		LPKBDLLHOOKSTRUCT lpKeyboard = (LPKBDLLHOOKSTRUCT)lParam;
    		HWND hCurWnd = ::GetFocus();
    		HIMC hImc = ImmGetContext(hCurWnd);
    		LONG nSize = ImmGetCompositionString(hImc, GCS_COMPSTR, NULL, 0);
    		ImmReleaseContext(hCurWnd, hImc);
    		if (hImc)
    		{
    			if (nSize > 0)
    			{
    				//如果按键组合窗口字符串长度大于0,则表明显示了按键组合窗口,交给系统默认处理
    				g_bInterceptBackspace = false;
    				bRet = TRUE;
    			}
    			else if (nSize == 0)
    			{
    				if (!g_bInterceptBackspace)
    				{
    					//如果按键组合框窗口字符串等于0,且上次显示了按键组合框窗口,则表明是删除最后一个字符后,交给系统默认处理
    					g_bInterceptBackspace = true;
    					bRet = TRUE;
    				}
    			}
    		}
    		if (VK_BACK == wParam)
    		{
    			if (!bRet)
    			{
    				if (lParam & 0x80000000)
    				{
    					::SendMessage(::GetFocus(), WM_KEYUP, VK_BACK, 0);
    				}
    				else
    				{
    					::SendMessage(hCurWnd, WM_KEYDOWN, VK_BACK, 0);
    					::SendMessage(hCurWnd, WM_CHAR, VK_BACK, 0);
    				}
    				return 1;
    			}
    		}
    	}
    
    	return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
    }

    4、安装钩子

    g_hKeyboardHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardHookProc, 0, GetCurrentThreadId());

    5、卸载钩子

    ::UnhookWindowsHookEx(g_hKeyboardHook);

  • 相关阅读:
    saxbuilder用法
    【转】开篇python--明白python文件如何组织,理解建立源文件
    [转]linux awk命令详解
    sed 指定行范围匹配(转)
    MySQL Error Code文档手册---摘自MySQL官方网站
    java文件读写操作大全
    详解coredump
    Java中Map根据键值(key)或者值(value)进行排序实现
    java如何对map进行排序详解(map集合的使用)
    遍历Map的四种方法
  • 原文地址:https://www.cnblogs.com/dongc/p/5225131.html
Copyright © 2020-2023  润新知