在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行。
这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有“<换行>”,即“/n”;Windows系统里面,每行结尾是“<换行><回车>”,即“/n/r”;Mac系统里,每行结尾是“<回车>”。一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。
当用户按下某个键时,
' 1.键盘会检测到这个动作,并通过键盘控制器把扫描码(scan code)传送到计算机;
' 键盘扫描码跟具体的硬件有关的,不同厂商对同一个键的扫描码有可能不同。
' 2.计算机接收到扫描码后,将其交给键盘驱动程序;
' 3.键盘驱动程序把这个扫描码转换为键盘虚拟码;
' 虚拟码与具体硬件无关,不同厂商的键盘,同一个键的虚拟码总是相同的。
' 3.然后,键盘驱动程序把该键盘操作的扫描码和虚拟码以及其它信息传递给操作系统;
' 4.操作系统将获得的信息封装在一个键盘消息中,并把该键盘消息插入到消息列队。
' 5.通过Windows的消息系统,该键盘消息被送到某个窗口中;
' 6.窗口所在的应用程序接收到消息后,可以了解到有关键盘操作的信息,然后决定作出一定的响应
http://wenku.baidu.com/view/4ab9e23a87c24028915fc339.html
public struct KBDLLHOOKSTRUCT
{
public int vkCode;
int scanCode;
public int flags;
int time;
int dwExtraInfo;
}
lParam: 总长4字节,32位
'0–15位:用于指定当前消息的重复次数。当用户按下某个键持续一段时间的话,
' 该值是自动计数的按下某键的次数;若按键时间很长,则会发出多个消息,
' 且重复次数不会累计
'16–23:指定扫描码
'24:指定是否该键是一个扩展键(如alt、ctrl),若值为1表示是扩展键,否则其值为0
'25–28:保留
'29:指定上下文环境码。对于WM_KEYDOWN、WM_KEYUP消息,其值总为0,
' 对WM_CHAR消息,如果同时alt键被按下,则值为1,否则值为0.
'30:指定前键状态。如果消息发送前该键是按下状态,其值为1,否则为0
'31:指定转换状态,对于WM_KEYDOWN,其值总为0;
' 对于WM_CHAR,如果该键被释放,则其值为1,否则为0.
附
虚拟键码 | 对应值 | 对应键 |
---|---|---|
VK_LBUTTON | 1 | 鼠标左键 |
VK_RBUTTON | 2 | 鼠标右键 |
VK_CANCEL | 3 | Cancel |
VK_MBUTTON | 4 | 鼠标中键 |
VK_XBUTTON1 | 5 | |
VK_XBUTTON2 | 6 | |
VK_BACK | 8 | Backspace |
VK_TAB | 9 | Tab |
VK_CLEAR | 12 | Clear |
VK_RETURN | 13 | Enter |
VK_SHIFT | 16 | Shift |
VK_CONTROL | 17 | Ctrl |
VK_MENU | 18 | Alt |
VK_PAUSE | 19 | Pause |
VK_CAPITAL | 20 | Caps Lock |
VK_KANA | 21 | |
VK_HANGUL | 21 | |
VK_JUNJA | 23 | |
VK_FINAL | 24 | |
VK_HANJA | 25 | |
VK_KANJI | 25* | |
VK_ESCAPE | 27 | Esc |
VK_CONVERT | 28 | |
VK_NONCONVERT | 29 | |
VK_ACCEPT | 30 | |
VK_MODECHANGE | 31 | |
VK_SPACE | 32 | Space |
VK_PRIOR | 33 | Page Up |
VK_NEXT | 34 | Page Down |
VK_END | 35 | End |
VK_HOME | 36 | Home |
VK_LEFT | 37 | Left Arrow |
VK_UP | 38 | Up Arrow |
VK_RIGHT | 39 | Right Arrow |
VK_DOWN | 40 | Down Arrow |
VK_SELECT | 41 | Select |
VK_PRINT | 42 | |
VK_EXECUTE | 43 | Execute |
VK_SNAPSHOT | 44 | Snapshot |
VK_INSERT | 45 | Insert |
VK_DELETE | 46 | Delete |
VK_HELP | 47 | Help |
48 | 0 | |
49 | 1 | |
50 | 2 | |
51 | 3 | |
52 | 4 | |
53 | 5 | |
54 | 6 | |
55 | 7 | |
56 | 8 | |
57 | 9 | |
65 | A | |
66 | B | |
67 | C | |
68 | D | |
69 | E | |
70 | F | |
71 | G | |
72 | H | |
73 | I | |
74 | J | |
75 | K | |
76 | L | |
77 | M | |
78 | N | |
79 | O | |
80 | P | |
81 | Q | |
82 | R | |
83 | S | |
84 | T | |
85 | U | |
86 | V | |
87 | W | |
88 | X | |
89 | Y | |
90 | Z | |
VK_LWIN | 91 | |
VK_RWIN | 92 | |
VK_APPS | 93 | |
VK_SLEEP | 95 | |
VK_NUMPAD0 | 96 | 小键盘 0 |
VK_NUMPAD1 | 97 | 小键盘 1 |
VK_NUMPAD2 | 98 | 小键盘 2 |
VK_NUMPAD3 | 99 | 小键盘 3 |
VK_NUMPAD4 | 100 | 小键盘 4 |
VK_NUMPAD5 | 101 | 小键盘 5 |
VK_NUMPAD6 | 102 | 小键盘 6 |
VK_NUMPAD7 | 103 | 小键盘 7 |
VK_NUMPAD8 | 104 | 小键盘 8 |
VK_NUMPAD9 | 105 | 小键盘 9 |
VK_MULTIPLY | 106 | 小键盘 * |
VK_ADD | 107 | 小键盘 + |
VK_SEPARATOR | 108 | 小键盘 Enter |
VK_SUBTRACT | 109 | 小键盘 - |
VK_DECIMAL | 110 | 小键盘 . |
VK_DIVIDE | 111 | 小键盘 / |
VK_F1 | 112 | F1 |
VK_F2 | 113 | F2 |
VK_F3 | 114 | F3 |
VK_F4 | 115 | F4 |
VK_F5 | 116 | F5 |
VK_F6 | 117 | F6 |
VK_F7 | 118 | F7 |
VK_F8 | 119 | F8 |
VK_F9 | 120 | F9 |
VK_F10 | 121 | F10 |
VK_F11 | 122 | F11 |
VK_F12 | 123 | F12 |
VK_F13 | 124 | |
VK_F14 | 125 | |
VK_F15 | 126 | |
VK_F16 | 127 | |
VK_F17 | 128 | |
VK_F18 | 129 | |
VK_F19 | 130 | |
VK_F20 | 131 | |
VK_F21 | 132 | |
VK_F22 | 133 | |
VK_F23 | 134 | |
VK_F24 | 135 | |
VK_NUMLOCK | 144 | Num Lock |
VK_SCROLL | 145 | Scroll |
VK_LSHIFT | 160 | |
VK_RSHIFT | 161 | |
VK_LCONTROL | 162 | |
VK_RCONTROL | 163 | |
VK_LMENU | 164 | |
VK_RMENU | 165 | |
VK_BROWSER_BACK | 166 | |
VK_BROWSER_FORWARD | 167 | |
VK_BROWSER_REFRESH | 168 | |
VK_BROWSER_STOP | 169 | |
VK_BROWSER_SEARCH | 170 | |
VK_BROWSER_FAVORITES | 171 | |
VK_BROWSER_HOME | 172 | |
VK_VOLUME_MUTE | 173 | VolumeMute |
VK_VOLUME_DOWN | 174 | VolumeDown |
VK_VOLUME_UP | 175 | VolumeUp |
VK_MEDIA_NEXT_TRACK | 176 | |
VK_MEDIA_PREV_TRACK | 177 | |
VK_MEDIA_STOP | 178 | |
VK_MEDIA_PLAY_PAUSE | 179 | |
VK_LAUNCH_MAIL | 180 | |
VK_LAUNCH_MEDIA_SELECT | 181 | |
VK_LAUNCH_APP1 | 182 | |
VK_LAUNCH_APP2 | 183 | |
VK_OEM_1 | 186 | ; : |
VK_OEM_PLUS | 187 | = + |
VK_OEM_COMMA | 188 | |
VK_OEM_MINUS | 189 | - _ |
VK_OEM_PERIOD | 190 | |
VK_OEM_2 | 191 | / ? |
VK_OEM_3 | 192 | ` ~ |
VK_OEM_4 | 219 | [ { |
VK_OEM_5 | 220 | / | |
VK_OEM_6 | 221 | ] } |
VK_OEM_7 | 222 | ' " |
VK_OEM_8 | 223 | |
VK_OEM_102 | 226 | |
VK_PACKET | 231 | |
VK_PROCESSKEY | 229 | |
VK_ATTN | 246 | |
VK_CRSEL | 247 | |
VK_EXSEL | 248 | |
VK_EREOF | 249 | |
VK_PLAY | 250 | |
VK_ZOOM | 251 | |
VK_NONAME | 252 | |
VK_PA1 | 253 | |
VK_OEM_CLEAR | 254 |