热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

将字符转换为键盘码的代码

以下这段代码可以将字符串转换为键盘码,以备需要时用到。-(int)keyCodeForCharacter:(NSString*)character{if(![characterlength

以下这段代码可以将字符串转换为键盘码,以备需要时用到。


- (int)keyCodeForCharacter: (NSString*)character {
if(![character length]) return -1;

char code;
BOOL shift, alt;
if(Ascii2Virtual( (char)[character characterAtIndex: 0], &shift, &alt, &code)) {
return code;
}
return -1;
}


BOOL Ascii2Virtual(char pcar, BOOL *pshift, BOOL *palt, char *pkeycode)
{
KeyboardLayoutRef keyboard;
const void *keyboardData; // keyboard layout data
UInt16 nbblocs;
char *modblocs, *blocs, *deadkeys;
int ix, ifin, numbloc, keycode;

BOOL shift, alt;
// get the current keyboard
if(KLGetCurrentKeyboardLayout(&keyboard)) return NO;
// get the description of the current keyboard layout
if(KLGetKeyboardLayoutProperty(keyboard, kKLKCHRData, &keyboardData)) return NO;
// get pointer early numbers of blocks for each combination of modifiers
modblocs = ((char *)keyboardData) + 2;
// get number of blocks keycode->ascii
nbblocs = *((UInt16 *)(keyboardData + 258));
// get pointer early blocks keycode-> ascii
blocs = ((char *)keyboardData) + 260;
// determining the size of all tables keycode-> ascii a scanner
ifin = nbblocs*128;
// determining pointer early in the tables of dead keys
deadkeys = blocs+ifin;
// Now it runs blocks keycode-> ascii to find the car ascii
for (ix=0; ix {
if (blocs[ix]==pcar)
{

// found ascii value: now we must determine which block it is
keycode = ix & 0×7f; // 0111 1111 mask
numbloc = ix >> 7;
break;
}
}

// not found: bail out (error)
if (ix >= ifin) return NO;

// from block number, we must find the combination of modifiers using this block
for (ix=0; ix<15; ix++)
{
// it does not address whether the modifiers are not "capital" and "option"
if (ix&1 || ix&4) continue;
// Combining modifiers found for the block
if (modblocs[ix]==numbloc)
{
shift = (ix&2) ? YES : NO;
alt = (ix&8) ? YES : NO;
break;
}
}
// combination modifiers not found: bail
if (ix>=15) return NO;
// save our parameters
*pkeycode=keycode;
*pshift=shift;
*palt=alt;

return YES;
}



推荐阅读
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 深入解析Android中的SQLite数据库使用
    本文详细介绍了如何在Android应用中使用SQLite数据库进行数据存储。通过自定义类继承SQLiteOpenHelper,实现数据库的创建与版本管理,并提供了具体的学生信息管理示例代码。 ... [详细]
  • 本文详细介绍了Java库XChart中的XYSeries类下的setLineColor()方法,并提供了多个实际应用场景的代码示例。 ... [详细]
  • 本文提供了手势解锁功能的详细实现方法和源码下载链接。通过分析手势解锁的界面和逻辑,详细介绍如何在iOS应用中实现这一功能。 ... [详细]
  • Android Studio 中 Activity 组件详解
    本文介绍了 Android 开发中 Activity 的基本概念、生命周期、状态转换以及如何创建和管理 Activity。通过详细的解释和示例代码,帮助开发者更好地理解和使用 Activity。 ... [详细]
  • Django 使用slug field时遇到的问题 ... [详细]
  • 本文介绍如何在Java中实现一个罗马数字计算器,重点在于如何通过循环和字符验证确保用户输入合法。我们将探讨创建一个方法来检查字符串中的非法字符,并使用循环不断提示用户输入,直到输入符合要求。 ... [详细]
  • 本文介绍如何在Windows Forms应用程序中使用C#实现DataGridView的多列排序功能,包括升序和降序排序。 ... [详细]
  • 本文详细介绍了如何在Android应用中使用GridView组件以网格形式展示数据(如文本和图像)。通过行列布局,实现类似矩阵的数据展示效果。 ... [详细]
  • 本文介绍了在Android项目中实现时间轴效果的方法,通过自定义ListView的Item布局和适配器逻辑,实现了动态显示和隐藏时间标签的功能。文中详细描述了布局文件、适配器代码以及时间格式化工具类的具体实现。 ... [详细]
  • Eclipse 下 JavaFX 程序开发指南
    本文介绍了 JavaFX,这是一个用于创建富客户端应用程序的 Java 图形和媒体工具包,并详细说明了如何在 Eclipse 环境中配置和开发 JavaFX 应用。 ... [详细]
  • Gradle复合构建详解
    自Gradle 3.3起,复合构建功能得以实现,这是一种能够整合其他独立构建的高级构建模式。本文将详细介绍复合构建与多项目构建的区别,以及如何在实际项目中应用复合构建。 ... [详细]
  • 前端常用的布局类型——前端布局
    1.Static静态布局固定宽高:2.Liquid流式布局宽高用百分比,按屏幕分辨率调整,布局不发生变化3.Adaptive自适应 ... [详细]
  • 本文详细介绍了Java库中`com.ait.tooling.nativetools.client.collection.NFastArrayList`类的构造函数`()`的使用方法,并提供了多个实际应用中的代码示例,帮助开发者更好地理解和使用这一高效的数据结构。 ... [详细]
  • 请看|差别_Android 6.0 运行时权限处理解析
    请看|差别_Android 6.0 运行时权限处理解析 ... [详细]
author-avatar
蚊子爱的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有