<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      通過浪費時間獲得快樂不是對時間的浪費
      Penilum meum pullo sententia Latin a est

      如何在Windows下開發(fā)輸入法:Mini How-to

      RIME (中州韻輸入法引擎)是一個跨平臺的輸入法框架。基於這一框架,開發(fā)者們在Windows、macOS、Linux、Android等平臺上創(chuàng)造了不同的輸入法前端實現(xiàn)。

      Weasel (小狼毫)是它的Windows版,從0.9.30到0.17.4版支持Windows XP SP3, 7, 8/8.1, 10, 11.

      從github下載了最新版。里面有env.vs2022.bat, 2019.bat, Visual Studio 2022 (Version 17)的.sln,2015的.vcxproj.

      AI說:開發(fā)IME (Input Method Editor),當前推薦使用TSF而非傳統(tǒng)的IMM32實現(xiàn)?。Text Services Framework集成于Windows XP及后續(xù)中。??文本服務層?作為COM組件實現(xiàn),提供鍵盤輸入、手寫識別、語音識別等功能。

      SilverLight安否?它是微軟2007年推出的跨瀏覽器插件,用于網(wǎng)頁端富媒體(視頻、交互式應用等)的渲染和開發(fā)?。

      Weasel依然用.def文件而不是dllexport(改錯:WeaselTSF目錄下7266行,ctffunc.h 3225行,TSF的頭文件). 它是個導出下列符號的.dll:
      ImeConversionList, ImeConfigure, ImeDestroy, ImeEscape, ImeInquire, ImeProcessKey, ImeSelect...

      一個.dll如何成為輸入法?修改注冊表。要改HKCU\Keyboard Layout\Preload和HKLM\SYSTEM\CurrentControlSet\Control\Keyboard Layouts等處。

      $ find -name '*' | xargs grep RegCreate
      ./WeaselSetup/imesetup.cpp: ret = RegCreateKey(hKey, hkl_str, &hSubKey);
      ./WeaselSetup/InstallOptionsDlg.h: ret = RegCreateKeyEx(rootKey, subpath, 0, NULL, 0,

      const WCHAR KEYBOARD_LAYOUTS_KEY[] =
        L"SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts";
      const WCHAR PRELOAD_KEY[] = L"Keyboard Layout\\Preload";
      
      if (register_ime) {
      HKL hKL = ImmInstallIME(ime_path.c_str(), get_weasel_ime_name().c_str());
      if (!hKL) {
        // manually register ime
        WCHAR hkl_str[16] = {0};
        HKEY hKey;
        LSTATUS ret = RegOpenKey(HKEY_LOCAL_MACHINE, KEYBOARD_LAYOUTS_KEY, &hKey);
        if (ret == ERROR_SUCCESS) {
          for (DWORD k = 0xE0200000 + (hant ? 0x0404 : 0x0804); k <= 0xE0FF0804;
               k += 0x10000) {
            StringCchPrintfW(hkl_str, _countof(hkl_str), L"%08X", k);
            HKEY hSubKey;
            ret = RegOpenKey(hKey, hkl_str, &hSubKey);
            if (ret == ERROR_SUCCESS) {
              WCHAR imeFile[32] = {0};
              DWORD len = sizeof(imeFile);
              DWORD type = 0;
              ret = RegQueryValueEx(hSubKey, L"Ime File", NULL, &type,
                                    (LPBYTE)imeFile, &len);
              if (ret = ERROR_SUCCESS) {
                if (_wcsicmp(imeFile, L"weasel.ime") == 0) {
                  hKL = (HKL)k;  // already there
                }
              }
              RegCloseKey(hSubKey);
            } else {
              // found a spare number to register
              ret = RegCreateKey(hKey, hkl_str, &hSubKey);
              if (ret == ERROR_SUCCESS) {
                const WCHAR ime_file[] = L"weasel.ime";
                RegSetValueEx(hSubKey, L"Ime File", 0, REG_SZ, (LPBYTE)ime_file,
                              sizeof(ime_file));
                const WCHAR layout_file[] = L"kbdus.dll";
                RegSetValueEx(hSubKey, L"Layout File", 0, REG_SZ,
                              (LPBYTE)layout_file, sizeof(layout_file));
                const std::wstring layout_text = get_weasel_ime_name();
                RegSetValueEx(hSubKey, L"Layout Text", 0, REG_SZ,
                              (LPBYTE)layout_text.c_str(),
                              layout_text.size() * sizeof(wchar_t));
                RegCloseKey(hSubKey);
                hKL = (HKL)k;
              }
              break;
            }
          }
          RegCloseKey(hKey);
        }
        if (hKL) {
          HKEY hPreloadKey;
          ret = RegOpenKey(HKEY_CURRENT_USER, PRELOAD_KEY, &hPreloadKey);
          if (ret == ERROR_SUCCESS) {
            for (size_t i = 1; true; ++i) {
              std::wstring number = std::to_wstring(i);
              DWORD type = 0;
              WCHAR value[32];
              DWORD len = sizeof(value);
              ret = RegQueryValueEx(hPreloadKey, number.c_str(), 0, &type,
                                    (LPBYTE)value, &len);
              if (ret != ERROR_SUCCESS) {
                RegSetValueEx(hPreloadKey, number.c_str(), 0, REG_SZ,
                              (const BYTE*)hkl_str,
                              (wcslen(hkl_str) + 1) * sizeof(WCHAR));
                break;
              }
            }
            RegCloseKey(hPreloadKey);
          }
        }
      }
      if (!hKL) {
        DWORD dwErr = GetLastError();
        WCHAR msg[100];
        CString str;
        str.LoadStringW(IDS_STR_ERRREGIME);
        StringCchPrintfW(msg, _countof(msg), str, hKL, dwErr);
        MSG_NOT_SILENT_ID_CAP(silent, msg, IDS_STR_INSTALL_FAILED,
                              MB_ICONERROR | MB_OK);
        return 1;
      }
      return 0;
      }
      View Code

      ~/weasel-master/WeaselIME$ wc -l *.cpp *.h
      26 dllmain.cpp
      155 ime.cpp
      267 KeyEvent.cpp
      8 stdafx.cpp
      566 WeaselIME.cpp
      941 immdev.h
      16 resource.h
      21 stdafx.h
      12 targetver.h
      69 WeaselIME.h
      2081 總計

      /* immdev.h - Input Method Manager definitions for IME developers */
      /* Copyright (c) Microsoft Corporation. All rights reserved. */

      很早以前,immdev.h, immdev.lib在DDK (Device Driver Development Kit)里,還帶區(qū)位等輸入法的源碼,后來好像挪進SDK里。

      有頭文件,有dll,但是沒.lib. AI說:創(chuàng)建一個文本文件imm32.def,內(nèi)容如下:
      EXPORTS
      ImmGetDefaultIMEWnd
      ImmInstallIMEA
      ...
      打開適用于您Visual Studio版本的Developer Command Prompt,然后執(zhí)行命令:lib /def:imm32.def /out:imm32.lib /MACHINE:X64

      微軟網(wǎng)站說:You can use LIB with the /DEF option to create an import library and an export file. LINK uses the export file to build a program that contains exports (usually a dynamic-link library (DLL)), and it uses the import library to resolve references to those exports in other programs.

      嗯,① DLL的導入庫與靜態(tài)庫不同,后者包含全部代碼,前者只是存根。② 過去我總說“導出給別人用的導入庫”,別扭。

      XP下Windows\SYSTEM32\imm32.dll一般為107KB (精簡版可能不同)。

      So, 您面對的就是1000行程序,而已。(改錯:基本是外包層)

      那些函數(shù)的文檔,微軟網(wǎng)站有:

      This section describes the IMM API and explains how to use the functionality to create and manage IME windows. It includes the following sections:

      • About Input Method Manager
      • Using Input Method Manager
      • Input Method Manager Reference

      IME自己沒有消息循環(huán),而是依賴宿主的。IME可以CreateWindow. WIN32 API.

      GDI+通過設備上下文(DC)作為與硬件交互的橋梁,提供矢量圖形繪制、圖像處理、文本渲染等功能?。gdiplus.h gdiplus.lib

      MFC應用程序啟動時,theApp對象首先被構(gòu)造,隨后程序進入AfxWinMain函數(shù)并最終調(diào)用CWinApp::Run()啟動主消息循環(huán),使用::GetMessage()從線程消息隊列中獲取消息。

      WPF應用程序啟動時,系統(tǒng)會自動創(chuàng)建一個UI主線程,并在其上運行消息循環(huán)。

      ~/weasel-master/WeaselUI$ wc -l *.cpp
      278 DirectWriteResources.cpp
      142 FullScreenLayout.cpp
      361 GdiplusBlur.cpp
      262 HorizontalLayout.cpp
      124 Layout.cpp
      395 StandardLayout.cpp
      8 stdafx.cpp
      239 VerticalLayout.cpp
      602 VHorizontalLayout.cpp
      1270 WeaselPanel.cpp
      179 WeaselUI.cpp
      3860 總計


      看過本書,好像叫高級C/C++編譯技術(shù) Advanced C and C++ Compiling,寫得很好(沒說我看懂了)。

      Linux下.a是為-static準備的;直接鏈接到.so

      This package, x11proto-dev ,  provides development headers blah blah, and also provides a number of utility headers ... 沒有.so

      posted @ 2025-10-28 15:16  華容道專家  閱讀(8)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 妺妺窝人体色www聚色窝仙踪| 丝袜人妖av在线一区二区| 国产欧美va欧美va在线| 亚洲AV成人片不卡无码| 古田县| 97久久久亚洲综合久久| 亚洲AV无码成H人动漫无遮挡 | 两个人的视频www免费| 少妇人妻偷人精品免费| 年日韩激情国产自偷亚洲| 亚洲qingse中文字幕久久| 成人精品视频一区二区三区| 一本色道久久—综合亚洲| 国产AV巨作丝袜秘书| 精品一区二区免费不卡| 欧美日韩欧美| 成人无套少萝内射中出| 熟女系列丰满熟妇AV| 久久人妻精品大屁股一区| 国产一二三区在线| 精品国产迷系列在线观看| 国产精品国产高清国产一区| 亚洲18禁一区二区三区| 4480yy亚洲午夜私人影院剧情| 亚洲国产长腿丝袜av天堂| 日韩人妻精品中文字幕专区| 少妇xxxxx性开放| 日本55丰满熟妇厨房伦| 国产成人99亚洲综合精品| 亚洲女女女同性video| 免费观看全黄做爰大片| 中文字幕第55页一区| 中文字幕有码日韩精品| 精品国产一区二区色老头| 国产精品多p对白交换绿帽| 日本妇人成熟免费| 激情综合网激情综合网五月| 欧美性猛交xxxx乱大交丰满| 镇雄县| 非会员区试看120秒6次| 啊┅┅快┅┅用力啊岳网站|