亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? keymap.cpp

?? tightvnc源碼
?? CPP
字號:
//  Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
//
//  This file is part of the VNC system.
//
//  The VNC system is free software; you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation; either version 2 of the License, or
//  (at your option) any later version.
//
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//
//  You should have received a copy of the GNU General Public License
//  along with this program; if not, write to the Free Software
//  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
//  USA.
//
// TightVNC distribution homepage on the Web: http://www.tightvnc.com/
//
// If the source code for the VNC system is not available from the place 
// whence you received this file, check http://www.uk.research.att.com/vnc or contact
// the authors on vnc@uk.research.att.com for information on obtaining it.

// Thanks to Martin C. Mueller <mcm@itwm.uni-kl.de> for assistance with the
// international keyboard mapping stuff.

// KeyMap.cpp

#include "stdhdrs.h"
#include "KeyMap.h"
#include "vncviewer.h"

// Define the keymap structure
typedef struct vncKeymapping_struct {
	UINT wincode;
	UINT Xcode;
} vncKeymapping;

// Make up a VK for Enter - I think anything outside the range 0-255 will do
static const UINT VK_KEYPAD_ENTER = 0x1234;

static const vncKeymapping keymap[] = {
	{VK_BACK,		XK_BackSpace},
	{VK_TAB,		XK_Tab},
	{VK_CLEAR,		XK_Clear},
	{VK_RETURN,		XK_Return},
	{VK_LSHIFT,		XK_Shift_L},
	{VK_RSHIFT,		XK_Shift_R},
    {VK_SHIFT,      XK_Shift_L},
	{VK_LCONTROL,	XK_Control_L},
	{VK_RCONTROL,	XK_Control_R},
    {VK_CONTROL,	XK_Control_L},
    {VK_LMENU,		XK_Alt_L},
    {VK_RMENU,		XK_Alt_R},
    {VK_MENU,		XK_Alt_L},
    {VK_PAUSE,		XK_Pause},
    {VK_CAPITAL,	XK_Caps_Lock},
    {VK_ESCAPE,		XK_Escape},
    {VK_SPACE,		XK_space},
    {VK_PRIOR,		XK_Page_Up},
    {VK_NEXT,		XK_Page_Down},
    {VK_END,		XK_End},
    {VK_HOME,		XK_Home},
    {VK_LEFT,		XK_Left},
    {VK_UP,			XK_Up},
    {VK_RIGHT,		XK_Right},
    {VK_DOWN,		XK_Down},
    {VK_SELECT,		XK_Select},
    {VK_EXECUTE,	XK_Execute},
    {VK_SNAPSHOT,	XK_Print},
    {VK_INSERT,		XK_Insert},
    {VK_DELETE,		XK_Delete},
    {VK_HELP,		XK_Help},
    {VK_NUMPAD0,	XK_KP_0},
    {VK_NUMPAD1,	XK_KP_1},
    {VK_NUMPAD2,	XK_KP_2},
    {VK_NUMPAD3,	XK_KP_3},
    {VK_NUMPAD4,	XK_KP_4},
    {VK_NUMPAD5,	XK_KP_5},
    {VK_NUMPAD6,	XK_KP_6},
    {VK_NUMPAD7,	XK_KP_7},
    {VK_NUMPAD8,	XK_KP_8},
    {VK_NUMPAD9,	XK_KP_9},
    {VK_MULTIPLY,	XK_KP_Multiply},
    {VK_ADD,		XK_KP_Add},
    {VK_SEPARATOR,	XK_KP_Separator},   // often comma
    {VK_SUBTRACT,	XK_KP_Subtract},
    {VK_DECIMAL,	XK_KP_Decimal},
    {VK_DIVIDE,		XK_KP_Divide},
    {VK_F1,			XK_F1},
    {VK_F2,			XK_F2},
    {VK_F3,			XK_F3},
    {VK_F4,			XK_F4},
    {VK_F5,			XK_F5},
    {VK_F6,			XK_F6},
    {VK_F7,			XK_F7},
    {VK_F8,			XK_F8},
    {VK_F9,			XK_F9},
    {VK_F10,		XK_F10},
    {VK_F11,		XK_F11},
    {VK_F12,		XK_F12},
    {VK_F13,		XK_F13},
    {VK_F14,		XK_F14},
    {VK_F15,		XK_F15},
    {VK_F16,		XK_F16},
    {VK_F17,		XK_F17},
    {VK_F18,		XK_F18},
    {VK_F19,		XK_F19},
    {VK_F20,		XK_F20},
    {VK_F21,		XK_F21},
    {VK_F22,		XK_F22},
    {VK_F23,		XK_F23},
    {VK_F24,		XK_F24},
    {VK_NUMLOCK,	XK_Num_Lock},
    {VK_SCROLL,		XK_Scroll_Lock},
    {VK_KEYPAD_ENTER,	XK_KP_Enter},
    {VK_CANCEL,         XK_Break}
};


KeyMap::KeyMap() {
};


KeyActionSpec KeyMap::PCtoX(UINT virtkey, DWORD keyData) { 
	UINT numkeys = 0;
    
    KeyActionSpec kas;
    kas.releaseModifiers = 0;

    bool extended = ((keyData & 0x1000000) != 0);
    vnclog.Print(8,_T(" keyData %04x "), keyData);
    
    if (extended) { 
        vnclog.Print(8, _T(" (extended) "));
        switch (virtkey) {
        case VK_MENU :
            virtkey = VK_RMENU; break;
        case VK_CONTROL:
            virtkey = VK_RCONTROL; break;
        case VK_RETURN:
            virtkey = VK_KEYPAD_ENTER; break;
        }
    }
    
    // We try looking it up in our table
    UINT mapsize = sizeof(keymap) / sizeof(vncKeymapping);
        
    // Look up the desired code in the table
    for (UINT i = 0; i < mapsize; i++)
    {
        if (keymap[i].wincode == virtkey) {
            kas.keycodes[numkeys++] = keymap[i].Xcode;
            break;
        }
    }
    

    if (numkeys != 0) {
		// A special case - use Meta instead of Alt if ScrollLock is on.
        UINT key = kas.keycodes[numkeys-1];
		if ( (key == XK_Alt_L || key == XK_Alt_R) &&
			 GetKeyState(VK_SCROLL) ) {
			if (key == XK_Alt_L) {
				kas.keycodes[numkeys-1] = XK_Meta_L;
			} else {
				kas.keycodes[numkeys-1] = XK_Meta_R;
			}
		}
        vnclog.Print(8, _T("keymap gives %u (%x) "), key, key);

    } else {
        // not found in table
        vnclog.Print(8, _T("not in special keymap, "));
		
		// Under CE, we're not so concerned about this bit because we handle a WM_CHAR message later


#ifndef UNDER_CE

        // we try a simple conversion to Ascii, using the current keyboard mapping
		::GetKeyboardState(keystate);

   		int ret = ::ToAscii(virtkey, 0, keystate, (WORD *) buf, 0);

        // If Left Ctrl & Alt both pressed and ToAscii gives a valid keysym
        // This is for AltGr on international keyboards  (= LCtrl-Alt).
        // e.g. Ctrl-Alt-Q gives @ on German keyboards
        if (  ((keystate[VK_MENU] & 0x80) != 0) &&
            ((keystate[VK_CONTROL] & 0x80) != 0) ) {

           // If the key means anything in this keyboard layout
           if  ( (ret >= 1) && 
                 ( ( (*buf >= 32) && (*buf <= 126) ) ||
                   ( (*buf >= 160) && (*buf <= 255) ) ) 
                ) {

               // Send the modifiers up, then the keystroke, then mods down
               // We don't release the right control; this allows German users
               // to use it for doing Ctl-@ etc. (though not under Win95 --
               // see below)

               if (GetKeyState(VK_LCONTROL) & 0x8000) kas.releaseModifiers |= KEYMAP_LCONTROL;
               if (GetKeyState(VK_LMENU)    & 0x8000) kas.releaseModifiers |= KEYMAP_LALT;
               if (GetKeyState(VK_RMENU)    & 0x8000) kas.releaseModifiers |= KEYMAP_RALT;

               // This is for windows 95, and possibly other systems.  
               // The above GetKeyState calls don't work in 95 - they always return 0.
               // But if we're here at all we know that control and alt are pressed, so let's
               // raise all Control and Alt keys if we haven't registered any yet.
               if (kas.releaseModifiers == 0)
                   kas.releaseModifiers = KEYMAP_LCONTROL | KEYMAP_LALT | KEYMAP_RALT;

               vnclog.Print(8, _T("Ctrl-Alt pressed: ToAscii (without modifiers) returns %d byte(s): "), ret);
                for (int i = 0; i < ret; i++) {
                   kas.keycodes[numkeys++] = *(buf+i);
                   vnclog.Print(8, _T("%02x (%c) "), *(buf+i) , *(buf+i));
                }
                vnclog.Print(8,_T("\n"));
           } 

        } 
        
        // If not a ctrl-alt key
        if (numkeys == 0) {

            // There are no keysyms corresponding to control characters 
            // Eg Ctrl F.  The server already knows whether the control 
            // key is pressed. So we are interested in the key that would be 
            // there if the Ctrl were not pressed.
            keystate[VK_CONTROL] = keystate[VK_LCONTROL] = keystate[VK_RCONTROL] = 0;

		    int ret = ::ToAscii(virtkey, 0, keystate, (WORD *) buf, 0);
            if (ret < 0) {
                switch (*buf) {
				case '`' :
					kas.keycodes[numkeys++] = XK_dead_grave; break;
				case '\'' :
					kas.keycodes[numkeys++] = XK_dead_acute; break;
				case '~' :
					kas.keycodes[numkeys++] = XK_dead_tilde; break;
				case '^':
					kas.keycodes[numkeys++] = XK_dead_circumflex; break;
                case 168:
					// dead_tilde / dead_diaeresis
					if ( (GetKeyState(VK_CONTROL) & 0x8000) &&
						 (GetKeyState(VK_MENU) & 0x8000) ) {
						// AltGr is pressed
						kas.keycodes[numkeys++] = XK_dead_tilde;
					} else {
						kas.keycodes[numkeys++] = XK_dead_diaeresis;
					}
					break;
				}
            }
            // if this works, and it's a regular printable character, we just send that
            if (ret >= 1) {
                vnclog.Print(8,_T("ToAscii (without ctrl) returns %d byte(s): "), ret);
                for (int i = 0; i < ret; i++) {
                   kas.keycodes[numkeys++] = *(buf+i);
                  vnclog.Print(8, _T("%02x (%c) "), *(buf+i) , *(buf+i));
                }
            }
        }
#endif

    }

    kas.keycodes[numkeys] = VoidKeyCode;
	return kas;
};

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美激情四射| 99国产精品一区| 欧美美女视频在线观看| 亚洲一区二区三区在线| 在线视频你懂得一区二区三区| 亚洲老司机在线| 精品视频1区2区| 香蕉久久一区二区不卡无毒影院| 777午夜精品免费视频| 日韩国产欧美在线观看| 日韩精品一区国产麻豆| 国产999精品久久久久久| 国产精品九色蝌蚪自拍| 在线观看日产精品| 日本欧美在线看| 国产精品天天看| 欧美性一级生活| 精品伊人久久久久7777人| 久久久影视传媒| 色哟哟一区二区在线观看| 午夜伦欧美伦电影理论片| 久久色成人在线| 99久久精品免费| 蜜臀精品一区二区三区在线观看| 久久久精品蜜桃| 欧美日韩一区在线观看| 国产一区二区网址| 一级女性全黄久久生活片免费| 3751色影院一区二区三区| 国产传媒欧美日韩成人| 亚洲专区一二三| 日本一区二区视频在线| 欧美精品免费视频| 成人福利电影精品一区二区在线观看| 一区二区三区四区中文字幕| 精品久久久久久久人人人人传媒 | 91精品国产综合久久久久久久 | 国产尤物一区二区| 一区二区在线电影| 久久久美女毛片| 欧美日本韩国一区二区三区视频 | 国产欧美精品一区二区色综合| 欧美性大战久久久久久久蜜臀| 国产乱人伦偷精品视频不卡| 亚洲午夜视频在线观看| 国产精品青草综合久久久久99| 在线成人午夜影院| 色哟哟在线观看一区二区三区| 国产综合久久久久久久久久久久| 亚洲国产日韩av| 国产精品乱码一区二区三区软件| 欧美一区二区三区在线观看 | 国产日韩欧美一区二区三区综合| 欧美羞羞免费网站| 91首页免费视频| 国产精品99久久久久久久vr | 亚洲高清在线视频| 亚洲蜜桃精久久久久久久| 久久久久久久久久久电影| 在线电影院国产精品| 在线亚洲一区观看| av影院午夜一区| 国产精品123区| 国产永久精品大片wwwapp| 老司机一区二区| 青青青爽久久午夜综合久久午夜| 午夜影院在线观看欧美| 亚洲黄一区二区三区| 18欧美亚洲精品| 国产精品嫩草影院com| 国产日韩欧美在线一区| 国产日韩综合av| 欧美激情在线看| 日本一区二区电影| 欧美国产综合色视频| 日本一区二区三区国色天香| 日本一区二区视频在线| 国产精品免费久久久久| 国产精品国产a| 亚洲视频精选在线| 亚洲精品视频在线观看网站| 亚洲精品高清视频在线观看| 亚洲一区二区在线观看视频| 亚洲高清免费一级二级三级| 丝袜亚洲另类丝袜在线| 视频一区欧美日韩| 麻豆视频一区二区| 国产精一品亚洲二区在线视频| 国产成人午夜视频| 色综合天天综合色综合av | 成人av在线网| 色综合视频在线观看| 欧美在线不卡视频| 欧美色视频一区| 91精品国产黑色紧身裤美女| 日韩你懂的在线播放| 久久久蜜桃精品| 亚洲人精品午夜| 亚洲成av人片在www色猫咪| 免费观看日韩电影| 国产99久久久国产精品潘金网站| 99国产欧美另类久久久精品| 欧美日韩成人一区| 欧美精品一区二区三区蜜桃视频 | 国产精品国产自产拍在线| 亚洲女同女同女同女同女同69| 亚洲国产视频网站| 韩国女主播成人在线| 99国产精品久久久久久久久久久| 在线免费观看日本一区| 日韩亚洲欧美在线观看| 国产嫩草影院久久久久| 亚洲综合区在线| 激情五月激情综合网| 99精品欧美一区二区蜜桃免费| 欧美久久免费观看| 日本一区二区视频在线| 亚洲第四色夜色| 成人一区二区在线观看| 欧美伦理电影网| 中文在线资源观看网站视频免费不卡| 亚洲在线视频一区| 国产一区二区伦理片| 日本道色综合久久| 精品国产乱码久久久久久夜甘婷婷 | 国产在线视频一区二区| 色菇凉天天综合网| 久久噜噜亚洲综合| 偷拍日韩校园综合在线| 99久久综合色| 久久综合九色综合欧美就去吻| 亚洲另类色综合网站| 国产精品一区二区三区四区| 69堂精品视频| 亚洲综合免费观看高清完整版在线| 国产主播一区二区| 91精品国产高清一区二区三区蜜臀| 国产精品成人一区二区三区夜夜夜| 蜜桃视频在线观看一区| 91精品办公室少妇高潮对白| 国产精品日韩精品欧美在线| 美腿丝袜亚洲三区| 欧美日韩一卡二卡三卡| 中文字幕一区二区三区在线播放| 国产一区999| 日韩无一区二区| 午夜国产精品一区| 91理论电影在线观看| 国产亚洲一区二区三区四区| 日韩av不卡一区二区| 欧美三区在线观看| 亚洲色图视频免费播放| 国产成人综合在线播放| 日韩欧美一二区| 日韩国产在线一| 欧美日韩和欧美的一区二区| 综合亚洲深深色噜噜狠狠网站| 丰满岳乱妇一区二区三区| 亚洲精品一区二区三区福利| 青青草成人在线观看| 欧美日本免费一区二区三区| 亚洲一区在线电影| 日本高清视频一区二区| 亚洲免费观看高清完整版在线观看 | 欧美激情一区二区三区蜜桃视频 | 五月天丁香久久| 欧美三级资源在线| 亚洲成人第一页| 欧美精品亚洲二区| 蜜臀av在线播放一区二区三区| 日韩一级完整毛片| 美女一区二区久久| 精品日韩在线观看| 国产在线精品免费av| 久久精品亚洲一区二区三区浴池 | 久久不见久久见免费视频7| 日韩欧美一区中文| 久久成人免费网| 亚洲精品一区二区三区蜜桃下载| 国产酒店精品激情| 国产精品麻豆久久久| 色婷婷综合五月| 亚洲国产精品一区二区久久| 欧美二区在线观看| 狠狠久久亚洲欧美| 国产精品乱人伦一区二区| 日本精品视频一区二区| 婷婷六月综合亚洲| 久久综合久久99| 成人的网站免费观看| 亚洲主播在线播放| 精品欧美黑人一区二区三区| 国产成人免费在线视频| 亚洲人成小说网站色在线| 欧美三级韩国三级日本三斤| 久久97超碰色| 成人免费在线视频| 日韩一区二区麻豆国产| 国产99久久久国产精品免费看| 亚洲综合区在线|