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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? im.cpp

?? WinCE5.0下軟鍵盤LARGEKB源代碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright (c) Microsoft Corporation.  All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
//
//
/*++


Module Name:

    im.cpp

Abstract:

    Sample LSIP Input Method.


Revision History:

--*/


#define INITGUID
#include <windows.h>
#include <coguid.h>
#undef INITGUID
#include <commctrl.h>
#include <sipapi.h>
#include "resource.h"
#include "dllmain.h"
#include "im.h"


#ifdef DEBUG

DBGPARAM dpCurSettings = {
    TEXT("DynamicIM"), {
    TEXT("Init"),TEXT("Keys"),TEXT(""),TEXT(""),
    TEXT(""),TEXT(""),TEXT(""),TEXT(""),
    TEXT(""),TEXT(""),TEXT("Interface"),TEXT("Misc"),
    TEXT("Alloc"),    TEXT("Function"), TEXT("Warning"),  TEXT("Error") },
    0x00000000
};
#else
DWORD   v_dwDebugFlag = 0x0;     // Allow some retail debug zones.
#endif // DEBUG


//
// The KEYENTRY structure describes a single key on the keyboard.
//
typedef struct {
    UINT    bVk;        // If VK then just a byte, -1 for sentinel
    UINT    wcUnshift;
    UINT    wcShift;
    UINT    nCtrl;
    DWORD   fdwFlags;
    int     nLeft;
} KEYENTRY;

#define NUM_ROWS    6
KEYENTRY g_keys[NUM_ROWS][16+1] = {
    // First Row
    {
        { VK_ESCAPE,    0,      0,       NO_CTL, F_VK,             0 },
        { VK_F1,        0,      0,       NO_CTL, F_VK,            29 },
        { VK_F2,        0,      0,       NO_CTL, F_VK,            58 },
        { VK_F3,        0,      0,       NO_CTL, F_VK,            87 },
        { VK_F4,        0,      0,       NO_CTL, F_VK,           116 },
        { VK_F5,        0,      0,       NO_CTL, F_VK,           145 },
        { VK_F6,        0,      0,       NO_CTL, F_VK,           174 },
        { VK_F7,        0,      0,       NO_CTL, F_VK,           203 },
        { VK_F8,        0,      0,       NO_CTL, F_VK,           232 },
        { VK_F9,        0,      0,       NO_CTL, F_VK,           261 },
        { VK_F10,       0,      0,       NO_CTL, F_VK,           290 },
        { VK_F11,       0,      0,       NO_CTL, F_VK,           319 },
        { VK_F12,       0,      0,       NO_CTL, F_VK,           348 },
        { VK_HOME,      0,      0,       NO_CTL, F_VK,           377 },
        { VK_END,       0,      0,       NO_CTL, F_VK,           406 },
        { VK_END/*PROP*/,0,     0,       NO_CTL, F_VK,           435 },
        // The above key should eventually be changed to something besides VK_END
        //  as soon as its purpose is clearly determined. */
        { SENTINEL,     0,      0,       NO_CTL, F_VK,           462 }
    },

    // Second row
    {
        { VK_BACKQUOTE, '`',    '~',     NO_CTL, 0,             0 },
        { '1',          '1',    '!',     NO_CTL, 0,               33 },
        { '2',          '2',    '@',     0,      0,               66 },
        { '3',          '3',    '#',     NO_CTL, 0,               99 },
        { '4',          '4',    '$',     NO_CTL, 0,              132 },
        { '5',          '5',    '%',     NO_CTL, 0,              165 },
        { '6',          '6',    '^',     30,     0,              198 },
        { '7',          '7',    '&',     NO_CTL, 0,              231 },
        { '8',          '8',    '*',     NO_CTL, 0,              264 },
        { '9',          '9',    '(',     NO_CTL, 0,              297 },
        { '0',          '0',    ')',     NO_CTL, 0,              330 },
        { VK_HYPHEN,    '-',    '_',     31,     0,              363 },
        { VK_EQUAL,     '=',    '+',     NO_CTL, 0,              396 },
        { VK_BACK,      '\x8',  '\x8',   127,    0,              429 },
        { SENTINEL,     0,      0,       NO_CTL, 0,              462 }
    },

    // Third row
    {
        { VK_TAB,       '\t',   '\t',    '\t',   0,              0   },
        { 'Q',          'q',    'Q',     17,     0,              33  },
        { 'W',          'w',    'W',     23,     0,              66  },
        { 'E',          'e',    'E',     5,      0,              99  },
        { 'R',          'r',    'R',     18,     0,              132 },
        { 'T',          't',    'T',     20,     0,              165 },
        { 'Y',          'y',    'Y',     25,     0,              198 },
        { 'U',          'u',    'U',     21,     0,              231 },
        { 'I',          'i',    'I',     9,      0,              264 },
        { 'O',          'o',    'O',     15,     0,              297 },
        { 'P',          'p',    'P',     16,     0,              330 },
        { VK_LBRACKET,  '[',    '{',     27,     0,              363 },
        { VK_RBRACKET,  ']',    '}',     29,     0,              396 },
        { VK_BACKSLASH, '\\',   '|',     28,     0,              429 },
        { SENTINEL,     0,      0,       NO_CTL, 0,              462 }
    },

    // Forth row
    {
        { VK_CAPITAL,   0,      0,      NO_CTL, F_VK | F_STK | F_REDRAW, 0 },
        { 'A',          'a',    'A',    1,      0,              33  },
        { 'S',          's',    'S',    19,     0,              66  },
        { 'D',          'd',    'D',    4,      0,              99  },
        { 'F',          'f',    'F',    6,      0,              132 },
        { 'G',          'g',    'G',    7,      0,              165 },
        { 'H',          'h',    'H',    8,      0,              198 },
        { 'J',          'j',    'J',    10,     0,              231 },
        { 'K',          'k',    'K',    11,     0,              264 },
        { 'L',          'l',    'L',    12,     0,              297 },
        { VK_SEMICOLON, ';',    ':',    NO_CTL, 0,              330 },
        { VK_APOSTROPHE,'\'',   '\"',   NO_CTL, 0,              363 },
        { VK_RETURN,    '\xD',  '\xD',  10,     0,              396 },
        { SENTINEL,     0,      0,      NO_CTL, 0,              462 }

    },

    // Fifth row
    {
        { VK_SHIFT,     0,      0,       NO_CTL, F_VK | F_STK | F_REDRAW, 0 },
        { 'Z',          'z',    'Z',     26,     0,              33  },
        { 'X',          'x',    'X',     24,     0,              66  },
        { 'C',          'c',    'C',     3,      0,              99  },
        { 'V',          'v',    'V',     22,     0,              132 },
        { 'B',          'b',    'B',     2,      0,              165 },
        { 'N',          'n',    'N',     14,     0,              198 },
        { 'M',          'm',    'M',     13,     0,              231 },
        { VK_COMMA,     ',',    '<',     NO_CTL, 0,              264 },
        { VK_PERIOD,    '.',    '>',     NO_CTL, 0,              297 },
        { VK_SLASH,     '/',    '?',     NO_CTL, 0,              330 },
        { VK_UP,        0,      0,       NO_CTL, 0,              363 },
        { VK_UP /**/,   0,      0,       NO_CTL, 0,              396 },
        { VK_PRIOR,     0,      0,       NO_CTL, 0,              429 },
        { SENTINEL,     0,      0,       NO_CTL, 0,              462 }
    },

    // Sixth row
    {
        { VK_CONTROL,   0,      0,       NO_CTL, F_VK | F_STK,     0 },
        { VK_LWIN,      0,      0,       0,      F_VK,            33 },
        { VK_LMENU,     0,      0,       0,      F_VK | F_STK,    66 },
        { VK_SPACE,     ' ',    ' ',     32,     0,               99 },
        { VK_INSERT,    0,      0,       NO_CTL, 0,              264 },
        { VK_DELETE,    0,      0,       NO_CTL, 0,              297 },
        { VK_LEFT,      0,      0,       NO_CTL, 0,              330 },
        { VK_DOWN,      0,      0,       NO_CTL, 0,              363 },
        { VK_RIGHT,     0,      0,       NO_CTL, 0,              396 },
        { VK_NEXT,      0,      0,       NO_CTL, 0,              429 },
        { SENTINEL,     0,      0,       NO_CTL, 0,              462 }
    },
};

static int g_RowCoord[8] = { 0, 29, 62, 95, 128, 161, 194, 0xFFFF };


//
// Globals.
//
static TCHAR const g_pwszClassName[] = TEXT("A523DFC7-1A7E-4af6-991A-510E75847828 - MicrosoftIMWndClass");
static HWND g_hwndMain;
static HDC  g_hdcKeybd;
static HBITMAP g_hbmKeybd, g_hbmOld;
static IIMCallback *g_pIMCallback;
static int g_nDown;				//普通按鍵是否被按下
static BOOL g_fControlDown;		//Control鍵是否按下
static BOOL g_fCapsLockDown;	//CapsLock鍵是否按下
static BOOL g_fShiftDown;		//Shift鍵是否按下
static BOOL g_fAltDown;			//Alt鍵是否按下



//
// Draw the key in the up/down position based on fPress 根據彈起或按下處的fPress值,繪制此處的按鍵
//
void IM_DrawKey(KEYENTRY *pKey, RECT *prc, BOOL fPress)
{
    HDC hdc;
    RECT rc;
    int Offset = 0;			//繪制鍵盤需要繪制BMP的上半部分還是下半部分鍵盤

    hdc = GetDC(g_hwndMain);

    rc = *prc;

    InflateRect(&rc, -1, -1);

    if (g_fShiftDown ^ g_fCapsLockDown) {
        Offset = 195;
    }

    BitBlt(hdc, rc.left, rc.top, rc.right - rc.left + 1, rc.bottom - rc.top + 1,
           g_hdcKeybd,  rc.left, rc.top + Offset, fPress ? NOTSRCCOPY : SRCCOPY);

    ReleaseDC(g_hwndMain, hdc);
}

//
// Paint an area of the keyboard. 繪制鍵盤的區域
// 
static
void WINAPI
IM_DrawArea( HDC hdc, RECT *prcUpdate )
{
    int Offset = 0;

    RETAILMSG (ZONE_FUNCTION, (TEXT("+IM_DrawArea(0x%08X, 0x%08X(%d,%d,%d,%d))\r\n"), hdc, prcUpdate,
                              prcUpdate->left, prcUpdate->top, prcUpdate->right, prcUpdate->bottom));

    // Draw the keys.
    if (g_fShiftDown ^ g_fCapsLockDown) {
        Offset = 195;	//繪制BMP下半部分,大寫字母
    }

    BitBlt(hdc, prcUpdate->left, prcUpdate->top, prcUpdate->right - prcUpdate->left,
           prcUpdate->bottom - prcUpdate->top, g_hdcKeybd,  prcUpdate->left,
           prcUpdate->top + Offset, SRCCOPY );

    // Now draw any keys that are down 現在繪制某一個被按下的鍵
	//
    if (g_nDown) {
        int nRow, nCol;
        KEYENTRY *pKey;
        RECT    rc;
        for (nRow = 0; nRow < NUM_ROWS; nRow++) {
            for (nCol = 0; SENTINEL != g_keys[nRow][nCol].bVk; nCol++) {
                pKey = &(g_keys[nRow][nCol]);
                if (pKey->fdwFlags & F_DOWN) {
                    rc.left   = pKey->nLeft;
                    rc.right  = (pKey + 1)->nLeft;
                    rc.top    = g_RowCoord[nRow];
                    rc.bottom = g_RowCoord[nRow + 1];
                    IM_DrawKey(pKey, &rc, TRUE);
                }
            }
        }
    }

    return;
}

//
// Refresh the entire keyboard bitmap. 刷新整個鍵盤的BMP圖
// 
static
void WINAPI
IM_SwitchBitmap( void )
{
    HDC hdc;
    RECT rc;

    GetClientRect( g_hwndMain, &rc );
    hdc = GetDC( g_hwndMain );
    IM_DrawArea( hdc, &rc );
    ReleaseDC( g_hwndMain, hdc );

    return;
}



//
// Determine the left edge of nKey + 1
//
#define KeyLeftCoord(nRow,nKey) (g_keys[nRow][nKey+1].nLeft)

//
// Determine what key contains the point specified in rcKey.left,rcKey.top.
// Fill in the full coordinates for the key and return the keyentry.
//
// Assumptions: we will not get a down event outside of our window, and every
// point in the window maps to a key.
//
__inline static
KEYENTRY* WINAPI
IM_GetKeyFromCoord( RECT *prcKey )
{
    int nRow = 0, nKey = 0, nLeft;
    POINT pt;

    pt.x = prcKey->left;
    pt.y = prcKey->top;

    //
    // Row
    //

    while( prcKey->top > g_RowCoord[nRow + 1] ) {
        nRow++;
    }

    if (nRow > 5) {
        nRow = 5;
    }

    //
    // Key
    //

    while (prcKey->left > (nLeft = KeyLeftCoord(nRow, nKey))) {
        nKey++;
    }

    RETAILMSG (ZONE_KEYS, (TEXT("%d,%d -> %d,%d\r\n"), prcKey->top, prcKey->left, nRow, nKey));

    //
    // Set up rect and return the key.
    //
    prcKey->left   = g_keys[nRow][nKey].nLeft;
    prcKey->right  = nLeft;
    prcKey->top    = g_RowCoord[nRow];
    prcKey->bottom = g_RowCoord[nRow + 1];

    return g_keys[nRow] + nKey;
}

//按鍵動作

static
BOOL WINAPI
IM_PressKey( BOOL fPress, KEYENTRY *pKey, RECT *prcKey )
{
    DWORD dwVkFlags;
    KEY_STATE_FLAGS nShiftState;
    HRESULT hRes;
    UINT *pnChar = NULL;

    if( fPress )
		{
        pKey->fdwFlags |= F_DOWN;
        dwVkFlags = KEYEVENTF_SILENT;
        nShiftState = KeyStateDownFlag;
		}
	else
		{
        pKey->fdwFlags &= ~F_DOWN;
        dwVkFlags = KEYEVENTF_KEYUP | KEYEVENTF_SILENT;
        nShiftState = KeyShiftNoCharacterFlag;
		}


    //
    // Adjust down count (an optimization for redraw and searching).
    //

    g_nDown += fPress ? 1 : -1;
    ASSERT(g_nDown >= 0);

    if ( pKey->fdwFlags & F_VK )
		{
        hRes = g_pIMCallback->SendVirtualKey( pKey->bVk, dwVkFlags );
		}
	else
		{
#define ISNOCHARACTERKEY(pKey) (pKey->wcUnshift == 0 && pKey->wcShift == 0)

        if (ISNOCHARACTERKEY(pKey))
			{
            nShiftState |= KeyShiftNoCharacterFlag;
			}
		if(g_fAltDown)
			{
			nShiftState |= KeyShiftAnyAltFlag | KeyShiftLeftAltFlag;
			}
        if (g_fControlDown)
			{
            nShiftState |= KeyShiftAnyCtrlFlag;
            if (NO_CTL == pKey->nCtrl)
				{
                nShiftState |= KeyShiftNoCharacterFlag;
				}
            pnChar = &pKey->nCtrl;
			}
		else if (g_fShiftDown ^ g_fCapsLockDown)
			{
            nShiftState |= KeyShiftAnyShiftFlag;
            pnChar = &pKey->wcShift;
			}
		else
			{
            pnChar = &pKey->wcUnshift;
			}

        if (pnChar)
			{
            hRes = g_pIMCallback->SendCharEvents(pKey->bVk, nShiftState, 1, &nShiftState, pnChar);
			}
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩国产精品91| 国产凹凸在线观看一区二区| 久久久久9999亚洲精品| 色一情一伦一子一伦一区| 精久久久久久久久久久| 亚洲午夜在线视频| 国产精品久久久久桃色tv| 欧美不卡一区二区三区| 欧美综合在线视频| 成人av资源站| 国产精品自拍av| 日本不卡一二三区黄网| 伊人开心综合网| 国产精品黄色在线观看| 国产亚洲精品aa| 日韩欧美国产综合一区| 欧美高清hd18日本| 日韩免费一区二区| 在线亚洲一区二区| 成人激情综合网站| 国产成人精品影院| 国产尤物一区二区在线| 日韩高清在线不卡| 日韩影院免费视频| 日韩国产精品久久久| 亚欧色一区w666天堂| 亚洲一区二区三区小说| 亚洲欧美一区二区久久| 综合久久综合久久| 国产精品动漫网站| 一区视频在线播放| 亚洲三级在线观看| 亚洲日本中文字幕区| 国产午夜亚洲精品羞羞网站| 久久综合九色综合欧美98| 欧美mv日韩mv| 久久综合精品国产一区二区三区 | 麻豆精品一区二区| 丝袜美腿高跟呻吟高潮一区| 偷窥国产亚洲免费视频 | 成人午夜激情影院| 国产盗摄精品一区二区三区在线| 国产在线麻豆精品观看| 国产一区在线看| 国产成人日日夜夜| 风间由美一区二区av101| 国产精品18久久久久久久久久久久| 韩国精品久久久| 国产酒店精品激情| 国产黄色精品网站| 99免费精品在线观看| 91在线国内视频| 在线日韩国产精品| 欧美一区二区三区人| 欧美精品一区二区三区在线播放| 欧美tickling挠脚心丨vk| 久久久夜色精品亚洲| 日本一区二区三区国色天香| 综合久久久久久久| 午夜久久久久久| 麻豆成人av在线| 懂色一区二区三区免费观看| 色综合婷婷久久| 欧美久久久一区| 久久综合久色欧美综合狠狠| 亚洲国产精品av| 一区二区三区中文字幕| 日本成人在线网站| 高清日韩电视剧大全免费| 91久久精品一区二区| 欧美一区三区二区| 国产精品美女久久久久久久| 亚洲在线观看免费视频| 激情深爱一区二区| 在线观看91av| 精品成人在线观看| 国产精品久久久久一区二区三区| 一区二区三区精品视频| 日本亚洲视频在线| 国产精品亚洲视频| 91视频一区二区三区| 日韩欧美国产综合一区 | 色94色欧美sute亚洲线路一ni | 精品在线你懂的| 成人免费不卡视频| 制服丝袜激情欧洲亚洲| 国产精品久久毛片a| 日韩国产欧美三级| 成人av第一页| 日韩视频一区在线观看| 亚洲人被黑人高潮完整版| 久久国产精品99精品国产| 99国产精品久久久久久久久久 | 在线观看国产精品网站| 久久综合久久鬼色中文字| 亚洲在线视频免费观看| 成人性生交大片免费看视频在线| 欧美精品成人一区二区三区四区| 国产精品美女一区二区三区| 蜜臀精品一区二区三区在线观看 | 国产欧美一区二区精品忘忧草 | 韩国成人精品a∨在线观看| 日本乱码高清不卡字幕| 国产亚洲美州欧州综合国| 日韩成人av影视| 91精彩视频在线| 国产精品女同互慰在线看| 国产一区在线观看视频| 91精品综合久久久久久| 亚洲午夜国产一区99re久久| 99九九99九九九视频精品| 国产午夜精品在线观看| 久久99精品国产麻豆婷婷| 精品美女一区二区三区| 日韩专区一卡二卡| 欧美四级电影网| 玉米视频成人免费看| www.在线成人| 国产精品理伦片| 国产精品性做久久久久久| 精品成人一区二区三区| 久久精品国产精品青草| 欧美一级xxx| 麻豆精品新av中文字幕| 欧美一区二区成人| 日本aⅴ精品一区二区三区| 欧美区视频在线观看| 一区二区三区色| 欧美色手机在线观看| 亚洲尤物视频在线| 欧美日韩精品福利| 五月天精品一区二区三区| 欧美日本国产视频| 亚洲成av人影院| 欧美一级欧美三级在线观看| 日本午夜一区二区| 日韩欧美资源站| 国产在线一区二区综合免费视频| 精品88久久久久88久久久| 国产一区二区在线看| 国产三级欧美三级日产三级99| 国内精品久久久久影院一蜜桃| 日韩欧美亚洲国产精品字幕久久久| 麻豆91免费观看| 久久久不卡网国产精品一区| 国产91精品久久久久久久网曝门 | 亚洲午夜免费福利视频| 欧美日韩免费观看一区三区| 五月婷婷综合在线| 欧美一级一级性生活免费录像| 久久99精品久久久久婷婷| 国产亚洲精品7777| 99r国产精品| 亚洲mv在线观看| 欧美不卡在线视频| 成人精品国产福利| 亚洲成人在线观看视频| 日韩一区二区视频| 国产成人aaaa| 一区二区三区在线看| 欧美一区三区四区| 成人免费观看av| 亚洲国产一区二区a毛片| 欧美一级午夜免费电影| 国产成人免费网站| 秋霞午夜鲁丝一区二区老狼| 精品国产第一区二区三区观看体验 | 欧美日韩你懂得| 韩国精品一区二区| 一区二区三区在线看| 日韩免费电影网站| 91视视频在线观看入口直接观看www| 午夜精品福利一区二区三区av| 2021国产精品久久精品| 色综合久久中文字幕| 久久97超碰色| 亚洲精品中文在线影院| 2024国产精品| 欧美日韩精品一区二区天天拍小说 | 欧美一区二区网站| voyeur盗摄精品| 蜜臀av一区二区在线免费观看| 国产精品久久久久久妇女6080| 56国语精品自产拍在线观看| 成人性生交大片免费看视频在线| 日韩极品在线观看| 国产精品久久久久久久久晋中| 91精品国产综合久久久久久久| 成人久久久精品乱码一区二区三区| 性做久久久久久免费观看欧美| 欧美极品xxx| 欧美刺激午夜性久久久久久久| 99国产精品国产精品毛片| 狠狠狠色丁香婷婷综合激情| 亚洲第四色夜色| 亚洲图片你懂的| 久久久久久久久久久久久女国产乱| 欧美久久久久免费| 欧美在线看片a免费观看| 国产寡妇亲子伦一区二区|