Visual C++编程控制输入法

Visual C++游戏编程基础之键盘消息 一、键盘 1.虚拟键码:Windows系统下所有的按键被视为虚拟键(包含鼠标在内),每一个虚拟键都有其对应的虚拟键码; 2.键盘消息 (1)VM_KEWDOWN:按下按键消息; (2)VM_KEYUP :松开按键消息; (3)VM_CHAR :字符消息,当按下的按键为定义于ASCII码中的可打印字符时,便发出此字符消息; 3.系统键 (1)VM_SYSKE... 阅读详情
   在Windows系统中一般都安装了至少三种输入法,在输入数据时常常会切换输入法,虽然Windows系统提供了切换快捷健,但对输入工作还是带来了不少麻烦。如果在应用程序中为用户提供智能输入法自动切换,那么这样的应用程序就显得更加专业、更加具有竞争力。不知你可用过Access,在表数据输入时Access自动切换输入法,如某字段需要输入英文时自动切换到En输入状态,如另一字段需要输入中文自动切换到某中文输入状态。

  本文将对如何在Windows应用程序中动态的控制输入法的技术进行探讨。在DELPHI中许多控件都有控制输入法的属性,用户在设计时只要设置好这个属性就可以了,但在VC中并不直接提供对输入法的控制,要在VC应用中实现这种功能必须调用Windows API。在本文中我将用一个类将与输入法操作有关的Windows API函数进行封装,读者可以直接将这个类导入项目工程中,通过操作这个类来实现对输入法的控制,这样更适合于面向对象的开发。

  要想控制输入法,首先要解决的问题是如果获得系统已安装的输入法信息。在Windows平台下,每个安装的输入法都在注册表中注册了相关信息。在 “HKEY_CURRENT_USER/keyboard layout/preload”键下就可以找到这些信息,键下由以1为基的递增数字做为值名(暂取名为数字号),其值的内容是一个由八个数字组成的字符串(暂取名为代号,如"e0040804"),其中左4位是设备代码(device identifier),右4位是语言代码(language identifier)。例如上面:左e004指智能ABC,右0804指大陆中文。在MSDN中对所有代码做了详细的说明,如感兴趣请浏览MSDN相关内容。另外要说明一点的是在Windows98版本中输入法注册信息与上面说明略有不同,它是将已安装的输入法的数字号做为…/Preload下面的子键,而Windows2000将数字号做为…/Preload键下的值。

   通过读取注册表中的输入法信息,可以列出所有已安装的输入法,但得到的输入法信息只是一些让人难懂的数字串,如何将这些数字串翻译成易懂的文字说明呢?同样, 在HKEY_LOCAL_MACHINE: "System/CurrentControlSet/Control/Keyboard Layouts/"键下注册了这些信息,它的子键名为输入法代号(keyboard layout),内容为该输入法的ime文件,名称等信息。到此,我们已经了解了Windows系统控制输入法的原理知识,下面我们开始着手创建一个控制输入法的C++类,主要步骤如下:

  1. 创建一个新类,新类名为:CInputLanguage

  2. 新建一个保存输入法信息的结构。当加载系统已安装的输入法信息时,用一个此结构的链表来保存输入法信息。

struct IL{
 char ilID[15]; //输入法代号。
 char szName[100];//输入法的说明文字。
 IL* pNext;
};

  3. 加入一个私有的成员变量

   IL* m_pILHead;

  4. 加入加载输入法列表信息的成员函数

//此函数只针对Windows2000以上版本,如要在Windows98版本的代码请与笔者联系。

BOOL CInputLanguage::LoadInputLanguage()
{
 HKEY hKey,hKey1;
 DWORD cp=16;
 char lp[15];
 CString szID;
 CString szKeyName,szKeyName1;
 szKeyName = "Keyboard Layout//Preload";
 szKeyName1 = "System//CurrentControlSet//Control//Keyboard Layouts//";

 int i=1;
 szID.Format("%d",i);

 DWORD lpT=REG_SZ;
 if(::RegOpenKey(HKEY_CURRENT_USER,szKeyName,&hKey)==ERROR_SUCCESS )
 {
  While( ::RegQueryValueEx(hKey,szID,NULL,&lpT,(LPBYTE)lp,&cp) == ERROR_SUCCESS )
  {
   CString szTempName;
   szTempName = szKeyName1 + (LPCTSTR)(LPTSTR)lp;
   if(RegOpenKey(HKEY_LOCAL_MACHINE,szTempName,&hKey1)==ERROR_SUCCESS )
   {
    char lpD[100];
    DWORD lpS=100; //DataSize
    if(RegQueryValueEx(hKey1,"Layout text",NULL,&lpT,(LPBYTE)lpD,&lpS)==ERROR_SUCCESS)
    {
     IL* p1,*p2;
     p1 = m_pILHead;
     p2 = new(IL);
     strcpy(p2->ilID,lp);
     strcpy(p2->szName,lpD);
     p2->pNext = NULL;
     if( p1 )
     {
      while( p1->pNext ){ p1 = p1->pNext ; }
      p1->pNext = p2;
     }
     else
     {
      m_pILHead = p2;
     }
    }
   }
   ::RegCloseKey(hKey1);
   i++;
   szID.Format("%d",i);
  }
 }

 ::RegCloseKey(hKey);
 return (m_pILHead != NULL );

}

  5. 加入选择输入法成员函数

BOOL CInputLanguage::SelectInputLanguage(IL *pIL)

{
 if( !pIL ) return FALSE;
  HKL hkl;
  hkl=LoadKeyboardLayout(pIL->ilID,KLF_ACTIVATE);//装载输入法
  if(hkl==NULL) return FALSE;
  else{
   ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
  }
  return TRUE;

}

  6. 其它部分

CInputLanguage::CInputLanguage()

{
 m_pILHead = NULL;
 LoadInputLanguage();

}

CInputLanguage::~CInputLanguage()

{
 Clear();
}

//消除链表内存。

void CInputLanguage::Clear()

{
 IL* p1,*p2;
 p1 = m_pILHead;

 while( p1 )
 {
  p2 = p1;
  p1 = p1->pNext;
  delete(p2);
 }
 m_pILHead = NULL;

}

//获得输入法信息链表头结点指针。

IL* CInputLanguage::GetInputLanguageList()

{
 return m_pILHead;
}


  使用此类时,只要将其头文件包括到要调用的文件中,调用GetInputLanguageList函数可以得到输入法信息链表的头结点指针,通过遍历此链表得到所有已安装的输入法的信息;通过SelectInputLanguage函数可以自由的控制输入法了
Visual C++在异步串行通信控制中的应用 Visual C++在异步串行通信控制中的应用邱红兵 韩峰  摘要:系统介绍了Visual C++实现异步串行通信的基本原理,分别讲述了用Windows函数库API函数实现和C运行时库的实现方法,以及在控制系统中的编程应用实例。  关键词:控制系统;串行通信;Visual C++应用  中图分类号:TP311.11     文献标识码:AThe Visual C++ 阅读详情

相关推荐

Visual C++控制台编程实战:CmdTool工具包

控制台编程是计算机编程的一个基本领域,它涉及使用命令行界面与用户进行交云。控制台应用程序通常执行后台任务或提供简单的用户界面,无需图形用户界面(GUI)。它们在处理系统任务和快速自动化任务方面特别有效。在C++中,标准输入输出流是IO库的基础部分,它们是与标准设备进行交互的主要方式。标准输入流对象cin用于从标准输入设备(通常是键盘)读取数据,而标准输出流对象cout则用于向标准输出设备(通常是屏幕)输出数据。标准输入输出流是通过头文件<iostream>声明的,该头文件中定义了。

weixin_42603332的博客 763

使用C++编写 切换输入法的方法

要在C++中实现切换输入法,你需要使用Windows API中的一些函数。函数获取当前输入法的上下文。要使用此函数,只需要在你的代码中调用。函数来获取当前窗口的句柄,然后使用。函数获取当前线程的ID,然后使用。在上面的代码中,我们使用了。函数来切换到下一个输入法。

weixin_45836201的博客 2964

Visual C++编程新手快速入门指南

安装Visual Studio IDE的第一步是检查您的系统是否满足基本要求。Visual Studio对操作系统有特定的版本要求,例如,Visual Studio 2019支持Windows 7 SP1及以上版本的操作系统。开发者需确保安装有最新的Windows更新以及满足CPU和内存的最小规格。安装Visual Studio的步骤如下:1. 从官方网站下载Visual Studio安装程序。2. 运行安装程序,并按照向导选择需要安装的工作负载。

weixin_36296444的博客 1158

VC环境下获取当前输入法

win7和win8环境下获取当前输入法很复杂。 转自: http://blog.youkuaiyun.com/puncha/article/details/13003065

panhongan的专栏 2820

Visual C++网络编程高级指南

本文还有配套的精品资源,点击获取 简介:《Visual C++网络高级编程》是一本专门介绍如何在Visual C++环境下进行高效网络应用开发的书籍。书中从基础的C++网络编程概念出发,深入探讨了使用Windows API和MFC库构建客户端和服务器应用程序的方法。此外,还涵盖了多线程技术、网络通信错误处理、网络安全协议以及Internet功能的使用。本书为C++开发者提供...

weixin_35753431的博客 1565

Visual C++编程详解:从基础到Windows应用开发

Visual C++ 是微软公司推出的一个功能强大的集成开发环境(IDE),它广泛应用于C++语言的开发,包括桌面应用程序、游戏、驱动程序以及系统软件等。作为一个成熟的开发工具,它提供了丰富的功能,从代码编辑、编译链接到调试、性能分析以及版本控制等,大大提高了开发效率。STL的强大之处在于它提供了一套统一的接口和数据结构来处理数据集合。通过使用STL组件,开发者能够以更少的代码量完成复杂的任务。STL容器本身是通用的,但有时候我们需要实现一些特殊的数据结构。

weixin_36059856的博客 1207

输入法 编程实现 linux,Visual C++编程控制输入法

//此函数只针对Windows2000以上版本,如要在Windows98版本的代码请与笔者联系。BOOL CInputLanguage::LoadInputLanguage(){HKEY hKey,hKey1;DWORD cp=16;char lp[15];CString szID;CString szKeyName,szKeyName1;szKeyName = "Keyboard Layout\...

weixin_39712705的博客 255

C++编程与Visual C++环境实战教程

Visual C++是微软公司推出的一款功能强大的C++集成开发环境,支持Windows平台下的程序开发。本章旨在为读者提供一个全面的视觉C++开发环境的概览,并引导读者掌握如何设置和配置该环境,以备后续章节的学习。Visual Studio使用解决方案(Solution)来组织一个或多个项目(Project)。每个项目包含了构建一个软件应用所需要的所有代码文件、资源、数据以及配置信息。在创建一个新的C++项目时,你可以选择多种项目模板,比如控制台应用程序、Windows桌面应用程序等。

weixin_42613017的博客 1147

Visual C++编程控制输入法http://www.7880.com/Info/Article-7c3a5e40.html

在Windows系统中一般都安装了至少三种输入法,在输入数据时常常会切换输入法,虽然Windows系统提供了切换快捷健,但对输入工作还是带来了不少麻烦。如果在应用程序中为用户提供智能输入法自动切换,那么这样的应用程序就显得更加专业、更加具有竞争力。不知你可用过Access,在表数据输入时Access自动切换输入法,如某字段需要输入英文时自动切换到En输入状态,如另一字段需要输入中文自动切换到某中文

xu的blog 3369

Visual C++编程实践与上机操作指导

本文还有配套的精品资源,点击获取 简介:《VC设计与上机指导》是一本全面的Visual C++学习资源,通过PDF格式介绍VC编程的基础知识和高级应用。本书覆盖了从IDE使用、C++基础、MFC入门、GUI设计、面向对象编程、文件操作、异常处理、多线程编程、DLL使用到网络编程等核心内容,并在最后提供了实战案例,以帮助读者将理论知识应用于实际项目开发中。 1. V...

weixin_42610010的博客 1028

Visual C++ 2005编程精粹源代码大全

Visual C++ 2005是微软公司推出的经典集成开发环境(IDE),它是Visual Studio 2005套件中的重要组成部分。与前代产品相比,它在易用性、性能和功能上都有了显著的提升。Visual C++ 2005带来了泛型编程、安全类型转换等现代C++特性,同时集成了更强大的调试工具和性能分析器,这些特点使得它成为开发复杂应用程序的首选环境。Visual C++ 2005提供了直观的用户界面和丰富的开发工具。界面主要分为菜单栏、工具栏、编辑区域、输出窗口等多个部分。

weixin_42451850的博客 1044

基于Visual C++实现输入法拦截

我们想知道用户输入了什么吗,那么我们可以拦截输入法吗,当然可以我们先实现钩子#include "windows.h" #include "imm.h" #include "stdio.h" //#define HOOK_API __declspec(dllexport) HHOOK g_hHook = NULL; //hook句柄

尹成的技术博客 6870

获取当前的输入法(vc)

根据指定窗口,获取当前输入法, 适用语言(vc6.0)

现代C++编程实践--用Visual Studio创建第一个C++程序

摘要:本文详细介绍了在Visual Studio 2022中创建和运行C++控制台项目的完整流程。首先指导读者通过菜单选择创建新项目,重点说明如何选择C++控制台应用程序模板并设置项目属性。文章展示了自动生成的"Hello World"程序结构,解释了VS项目组织方式(解决方案-项目-文件)。接着说明编译和运行程序的步骤。全文配有详细截图,适合C++初学者快速上手VS开发环境。

pzhfei的专栏 2166

获得系统输入法列表并且设置任一输入法

环境: 1.vs2010 2.Qt5.4.0(qt-opensource-windows-x86-msvc2010_opengl-5.4.0.exe) 步骤: 1.新建Qt工程:test 2.添加qt类:QInputLanguage 3.使用QInputLanguage (1)new一个QInputLanguage实例; (2)获得输入法列表:GetInputLanguageList(); (3)设置某一个输入法:SelectInputLanguage();

c++输入法切换的源码

得到window下所有输入法,并切换,公司做项目的代码,vs2010可以直接编译使用。希望这个资源对你有用。

上一篇: 用VC编写具有动态换肤功能的应用程序
下一篇: VC6.0实现逆向操作并防止界面闪烁
xmlscript
博客等级 码龄25年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值