【转】Delphi编写输入法程序。。。。。

利用Delphi编写Socket通信程序 一、Delphi与Socket  计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。TCP和UDP协议都非常复杂,尤其是TCP协议,为了保 阅读详情
 
代码思路原作者,不详.......................膜拜第一位作者的开创思维
本人只是稍作修改和写入一些原作者没有告诉的东西
首先输入法必备的19个接口自己不要删除,不然输入法编译出来安装失败不要狗叫= =
其次输入法的文件类型要设置为驱动,子类型要设置为输入法才能被ImmInstallIME函数安装,不然安装失败不能注入
如何修改参照最下面的方法
‍------------------------------------------------------------------
思路:
  1.创建一个文件映射对象,映射到内存,写入需要注入的dll名称,进程ID
  2.保存原有默认输入法句柄,复制输入法程序到系统目录,并调用ImmInstallIME安装输入法
  3.创建事件对象,以便同步dll的加载与卸载。
  4.向目标进程的窗口句柄发送WM_INPUTLANGCHANGEREQUEST消息,lParam为输入法句柄
  5.等待注入完成,广播WM_INPUTLANGCHANGEREQUEST消息,lParam为原有默认输入法句柄
  6.卸载输入法,释放事件对象。

先来ime输入法,记得把编译出来的程序后缀设置为ime
library   Ime;
uses
  Windows,
  SysUtils,
  Classes,
  Psapi,
  ImeMain in 'ImeMain.pas',
  ImeInject in 'ImeInject.pas';
{$E ime}
{$R  Ime.res}
procedure MyDllProc(Reason: Integer);
var
  LoadDllEvent:THandle;
  UnLoadDllEvent:THandle;
begin
  case Reason of
    DLL_PROCESS_ATTACH:
      begin
        UnLoadDllEvent:=OpenEvent(EVENT_ALL_ACCESS,False,GUID_UNLOADDLL);
        if UnLoadDllEvent>0 then
        begin
          ResetEvent(UnLoadDllEvent);
        end;
        RegisterImeWindow;
        GetImeInjectInfo(@InjectInfo);
        if InjectInfo.ProcessId=GetCurrentProcessId then
        begin
          LoadDllEvent:=OpenEvent(EVENT_ALL_ACCESS,False,GUID_LOADDLL);
          LoadLibrary(@InjectInfo.DllName);       
           if LoadDllEvent>0 then
          begin
            SetEvent(LoadDllEvent);
          end;
        end;
      end;
    DLL_PROCESS_DETACH:
      begin
        UnRegisterImeWindow;
        UnLoadDllEvent:=OpenEvent(EVENT_ALL_ACCESS,False,GUID_UNLOADDLL);
        if UnLoadDllEvent>0 then
        begin
          SetEvent(UnLoadDllEvent);
        end;
      end;
 end;
end;
 exports
  ImeConversionList,
  ImeConfigure,
  ImeDestroy,
  ImeEscape,
  ImeInquire,
  ImeProcessKey,
  ImeSelect,
  ImeSetActiveContext,
  ImeSetCompositionString,
  ImeToAsciiEx,
  NotifyIME,
  ImeRegisterWord,
  ImeUnregisterWord,
  ImeGetRegisterWordStyle,
  ImeEnumRegisterWord,
  UIWndProc,
  StatusWndProc,
  CompWndProc,
  CandWndProc;
begin
  DllProc := @MyDllProc;
  MyDllProc(DLL_PROCESS_ATTACH);
end.
‍-----------------------------------------------------
ime的主要单元
unit ImeMain;
interface
uses Windows,SysUtils,Classes,Imm,ImeInject;
const
  IME_WINDOWCLASSNAME='Ime';
  IME_SMODE_NONE=$0000;
  UI_CAP_2700=$00000001;
  SELECT_CAP_CONVERSION=$00000001;
  // IME property bits
  IME_PROP_END_UNLOAD=$00000001;
  IME_PROP_KBD_CHAR_FIRST=$00000002;
  IME_PROP_IGNORE_UPKEYS=$00000004;
  IME_PROP_NEED_ALTKEY=$00000008;
  IME_PROP_NO_KEYS_ON_CLOSE=$00000010;
  IME_PROP_AT_CARET=$00010000;
  IME_PROP_SPECIAL_UI=$00020000;
  IME_PROP_CANDLIST_START_FROM_1=$00040000;
  IME_PROP_UNICODE=$00080000;
  IME_PROP_COMPLETE_ON_UNSELECT=$00100000;
type
  PImeInfo=^TImeInfo;
  TImeInfo=record
    dwPrivateDataSize:DWORD;
    fdwProperty:DWORD;
    fdwConversionCaps:DWORD;
    fdwSentenceCaps:DWORD;
    fdwUICaps:DWORD;
    fdwSCSCaps:DWORD;
    fdwSelectCaps:DWORD;
  end;
  PTransMsg = ^TTransMsg;
  TTransMsg = record
    message: uInt;
    wParam: WParam;
    lParam: LParam;
  end;
  PTransMsgList = ^TTransMsgList;
  TTransMsgList = record
    uMsgCount: uInt;
    TransMsg: array[0..0] of TTransMsg;
  end;
  PPrivContext = ^TPrivContext;
  TPrivContext = record
    iImeState: Integer; 
    fdwImeMsg: DWord;   
    dwCompChar: DWord;  
    fdwGcsFlag: DWord;  
    uSYHFlg: uInt;
    uDYHFlg: uInt;
    uDSMHCount: uInt;
    uDSMHFlg: uInt;
    bSeq: array[0..12] of Char; // sequence code of input char
    fdwGB: DWord;
  end;
function RegisterImeWindow:BOOL;
procedure UnRegisterImeWindow;
function ImeConversionList(hImc:HIMC;lpSource:PChar;lpCandList:PCandidateList;
  uBufLen,uFlag:UINT):DWORD;stdcall;
function ImeConfigure(hKl:HKL;hWnd:HWND;dwMode:DWORD;lpData:Pointer)
  :BOOL;stdcall;
function ImeDestroy(uForce:UINT):BOOL;stdcall;
function ImeEscape(hImc:HIMC;uSubFunc:UINT;lpData:PChar):LRESULT;stdcall;
function ImeInquire(lpImeInfo:PImeInfo;lpszUIClass:PChar;lpszOption:DWORD)
  :BOOL;stdcall;
function ImeProcessKey(hImc:HIMC;uKey:UINT;lKeyData:LPARAM;
  lpbKeyState:PKeyboardState):BOOL;stdcall;
function ImeSelect(hImc:HIMC;fSelect:BOOL):BOOL;stdcall;
function ImeSetActiveContext(hImc:HIMC;fFlag:BOOL):BOOL;stdcall;
function ImeSetCompositionString(hImc:HIMC;dwIndex:DWORD;lpComp:Pointer;
  dwComp:DWORD;lpRead:Pointer;dwRead:DWORD):BOOL;stdcall;
function ImeToAsciiEx(uVKey,uScanCode:UINT;lpbKeyState:PKeyboardState;
  lpdwTransKey:PTransMsgList;fuState:UINT;hImc:HIMC):UINT;stdcall;
function NotifyIME(hImc:HIMC;dwAction:DWORD;dwIndex:DWORD;
  dwValue:DWORD):BOOL;stdcall;
function ImeRegisterWord(lpszReading:PChar;dwStyle:DWORD;lpszString:PChar)
  :BOOL;stdcall;
function ImeUnregisterWord(lpszReading:PChar;dwStyle:DWORD;lpszString:PChar)
  :BOOL;stdcall;
function ImeGetRegisterWordStyle(nItem:UINT;lpStyleBuf:PStyleBuf):UINT;stdcall;
function ImeEnumRegisterWord(lpfnRegisterWordEnumProc:RegisterWordEnumProc;
  lpszReading:PChar;dwStyle:DWORD;lpszString:PChar;lpData:Pointer):UINT;stdcall;
function UIWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM)
  :LRESULT;stdcall;
function StatusWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM)
  :LRESULT;stdcall;
function CompWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM)
  :LRESULT;stdcall;
function CandWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM)
  :LRESULT;stdcall;
var
  InjectInfo:TImeInject;
implementation
function RegisterImeWindow:BOOL;
var
  wc:WNDCLASSEX;
begin
  wc.style:=CS_IME or CS_VREDRAW or CS_HREDRAW or CS_DBLCLKS;
  wc.lpfnWndProc:=@UIWndProc;
  wc.cbClsExtra:=0;
  wc.cbWndExtra:=0;
  wc.hInstance:=HInstance;
  wc.hIcon:=0;
  wc.hCursor:=LoadCursor(0, IDC_ARROW );
  wc.hbrBackground:=GetStockObject(WHITE_BRUSH);
  wc.lpszMenuName:=nil;
  wc.lpszClassName:=IME_WINDOWCLASSNAME;
  wc.hIconSm:=0;
  Result:=Windows.RegisterClassEx(wc)<>0;
end;

procedure UnRegisterImeWindow;
begin
  Windows.UnregisterClass(IME_WINDOWCLASSNAME,HInstance);
end;
function ImeConversionList(hImc:HIMC;lpSource:PChar;lpCandList:PCandidateList;
  uBufLen,uFlag:UINT):DWORD;
begin
  Result:=0;
end;
function ImeConfigure(hKl:HKL;hWnd:HWND;dwMode:DWORD;lpData:Pointer):BOOL;
begin
  Result:=dwMode=IME_CONFIG_GENERAL;
end;
function ImeDestroy(uForce:UINT):BOOL;
begin
  Result:=not BOOL(uForce);
end;
function ImeEscape(hImc:HIMC;uSubFunc:UINT;lpData:PChar):LRESULT;
begin
  Result:=0;
end;
function ImeInquire(lpImeInfo:PImeInfo;lpszUIClass:PChar;lpszOption:DWORD):BOOL;
begin
  Result := False;
  lpImeInfo.dwPrivateDataSize:=SizeOf(TPrivContext);
  lpImeInfo.fdwProperty:=IME_PROP_KBD_CHAR_FIRST or IME_PROP_IGNORE_UPKEYS;
  lpImeInfo.fdwConversionCaps:=IME_CMODE_FULLSHAPE or IME_CMODE_NATIVE;
  lpImeInfo.fdwSentenceCaps:=IME_SMODE_NONE;
  lpImeInfo.fdwUICaps:=UI_CAP_2700;
  lpImeInfo.fdwSCSCaps:=0;
  lpImeInfo.fdwSelectCaps:=SELECT_CAP_CONVERSION;
  StrCopy(lpszUIClass,IME_WINDOWCLASSNAME);
  Result:=True;
end;
function ImeProcessKey(hImc:HIMC;uKey:UINT;lKeyData:LPARAM;
  lpbKeyState:PKeyboardState):BOOL;
begin
  Result:=False;
end;
function ImeSelect(hImc:HIMC;fSelect:BOOL):BOOL;
begin
  Result:=True;
end;
function ImeSetActiveContext(hImc:HIMC;fFlag:BOOL):BOOL;
begin
  Result:=True;
end;

function ImeSetCompositionString(hImc:HIMC;dwIndex:DWORD;lpComp:Pointer;
  dwComp:DWORD;lpRead:Pointer;dwRead:DWORD):BOOL;
begin
  Result:=False;
end;
function ImeToAsciiEx(uVKey,uScanCode:UINT;lpbKeyState:PKeyboardState;
  lpdwTransKey:PTransMsgList;fuState:UINT;hImc:HIMC):UINT;
begin
  Result:=0;
end;
function NotifyIme(hImc:HIMC;dwAction:DWORD;dwIndex:DWORD;
  dwValue:DWORD):BOOL;
begin
  Result:=False;
end;
function ImeRegisterWord(lpszReading:PChar;dwStyle:DWORD;lpszString:PChar):BOOL;
begin
  Result:=False;
end;
function ImeUnregisterWord(lpszReading:PChar;dwStyle:DWORD;lpszString:PChar)
  :BOOL;
begin
  Result:=False;
end;
function ImeGetRegisterWordStyle(nItem:UINT;lpStyleBuf:PStyleBuf):UINT;
begin
  Result:=0;
end;
function ImeEnumRegisterWord(lpfnRegisterWordEnumProc:RegisterWordEnumProc;
  lpszReading:PChar;dwStyle:DWORD;lpszString:PChar;lpData:Pointer):UINT;
begin
  Result:=0;
end;
function UIWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT;
begin
  Result:=0;
end;
function StatusWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT;
begin
  Result:=0;
end;
function CompWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT;
begin
  Result:=0;
end;
function CandWndProc(hWnd:HWND;Msg:UINT;wParam:WPARAM;lParam:LPARAM):LRESULT;
begin
  Result:=0;
end;
end.
---------------------------------------------------------------
ime和注入程序的公共单元
unit ImeInject;
interface
uses Windows,SysUtils;
const
  GUID_INJECT='{7E145D1D-663A-5BDC-EA47-B11342BF2315}';
  GUID_LOADDLL='{7E145D1D-663A-5BDC-EA47-B11342BF2416}';
  GUID_UNLOADDLL='{7E145D1D-663A-5BDC-EA47-B11342BF2517}';
type
  PImeInject= ^TImeInject;
  TImeInject= packed record
    DllName:array[0..MAX_PATH] of Char;//注入的dll路径
    ProcessId: DWORD;//注入的进程ID
  end;
procedure CreateImeInjectInfo(DllName: string; ProcessId: DWORD; var FileMapHandle:THandle);
procedure GetImeInjectInfo(ImeInject:PImeInject);
implementation
procedure CreateImeInjectInfo(DllName:string; ProcessId: DWORD; var FileMapHandle:THandle);
var
  InjectInfo:PImeInject;
begin
  FileMapHandle:=0;
  FileMapHandle := CreateFileMapping(INVALID_HANDLE_VALUE,nil,PAGE_READWRITE,0,SizeOf(TImeInject),GUID_INJECT); //以可读写形式创建有名文件映象
  if FileMapHandle > 0 then //返回的文件映射对象句柄不为零
  begin
    InjectInfo:=MapViewOfFile(FileMapHandle,FILE_MAP_ALL_ACCESS,0,0,0); //在调用的进程中地址空间映射一个可完全控制文件视图
    if InjectInfo<>nil then  //如果返回的映射视图的起始地址不为空
    begin
      ZeroMemory(InjectInfo,SizeOf(TImeInject)); //TImeInject结构内存填零
      CopyMemory(@(InjectInfo.DllName),PChar(DllName),MAX_PATH-1);  //填写结构体里的内容
      InjectInfo.ProcessId:=ProcessId; //填写进程ID
      UnmapViewOfFile(InjectInfo);  // 删除映射视图
    end;
  end;
end;
procedure GetImeInjectInfo(ImeInject:PImeInject);
var
  FileMapHandle:THandle;
  InjectInfo:PImeInject;
begin
  ZeroMemory(ImeInject,SizeOf(TImeInject));  //结构体内存填零
  FileMapHandle:=OpenFileMapping(FILE_MAP_READ,False,GUID_INJECT); //打开GUID_INJECT的文件映射
  if FileMapHandle>0 then 
  begin
    InjectInfo:=MapViewOfFile(FileMapHandle,FILE_MAP_READ,0,0,0);
    if InjectInfo<>nil then
    begin
      CopyMemory(ImeInject,InjectInfo,SizeOf(TImeInject));
      UnmapViewOfFile(InjectInfo);
    end;
    CloseHandle(FileMapHandle);
  end;
end;
end.
-----------------------------------------------------------------------------------------
注入程序,注意引用 ImeInject 单元 ,Imm 单元 和 Registry 单元

const
  WM_INPUTLANGCHANGEREQUEST = $0050;
var
  FileMapHandle: THandle;

Procedure Inject(WindowName:string;Dllpath:string);
var
  WindowHandle: THandle;
  InjectProcessId: DWORD;
  LoadDllEvent: THandle;
  UnLoadDllEvent: THandle;
  DefaultImeHandle: THandle;
  ImeHandle: THandle;
  ImeId: string;
  ImePath: string;
  SysDir: array[0..MAX_PATH] of Char;
begin
  WindowHandle := FindWindow(nil, PChar(WindowName));
  if WindowHandle > 0 then
  begin
    GetWindowThreadProcessId(WindowHandle, InjectProcessId);
    if InjectProcessId > 0 then
    begin
      if FileMapHandle > 0 then
        CloseHandle(FileMapHandle);
      CreateImeInjectInfo(PChar(Dllpath), InjectProcessId,
        FileMapHandle);
      if FileMapHandle > 0 then
      begin
        SystemParametersInfo(SPI_GETDEFAULTINPUTLANG, 0, @DefaultImeHandle, 0);
        ZeroMemory(@SysDir, MAX_PATH);
        GetSystemDirectory(@SysDir, MAX_PATH);
        ImePath := string(SysDir) + '\ImeInject.ime';
        //复制输入法文件到系统目录
        if CopyFile(PChar(ExtractFilePath(Application.ExeName) + 'ImeInject.ime'),
          PChar(ImePath), False) then
        begin
          //安装输入法
          ImeHandle := ImmInstallIME(PChar(ImePath), 'zhusjm输入法');
          if ImeHandle > 0 then
          begin
            UnLoadDllEvent := CreateEvent(nil, True, True, GUID_UNLOADDLL);
            LoadDllEvent := CreateEvent(nil, True, False, GUID_LOADDLL);
            //向目标窗口发送激活输入法的消息
            PostMessage(WindowHandle,WM_INPUTLANGCHANGEREQUEST, 0,ImeHandle);
            //等待注入完成
            if WaitForSingleObject(LoadDllEvent, 3000) = WAIT_OBJECT_0 then
            begin
              ShowMessage('注入成功');
              //广播消息,使我们的输入法卸载
              PostMessage(HWND_BROADCAST, WM_INPUTLANGCHANGEREQUEST, 0,
                DefaultImeHandle);
              //等待输入法卸载
              if WaitForSingleObject(UnLoadDllEvent, 3000) = WAIT_OBJECT_0 then
              begin
              end;
            end;
            UnloadKeyboardLayout(ImeHandle);
            DeleteFile(ImePath);
            CloseHandle(UnLoadDllEvent);
            CloseHandle(LoadDllEvent);
          end;
        end;
      end;
    end;
  end;
end;‍
---------------------------------------------------------------------
因为ime的文件类型要设置为驱动,子类型要设置为输入法才能被ImmInstallIME函数安装,不然安装失败
输入法ime的 资源文件,新建 rc 写入以下内容用delphi的brcc32.exe编译成res 然后 ime 里面
引用这个资源再编译出来ime输入法才能被ImmInstallIME函数安装
VS_VERSION_INFO VERSIONINFO //版本信息结构
FILEVERSION 1,0,0,1   //文件版本
PRODUCTVERSION 1,0,0,1 //这里是主版本信息
FILEFLAGSMASK 0x3fL   //这里设为0x3fL就好
#ifdef _DEBUG
FILEFLAGS 0x1L       //VS_FF_DEBUG包括debug信息
#else
FILEFLAGS 0x0L       //无
#endif
FILEOS 0x4L         //win32程序
FILETYPE 0x3L       //文件类型,2是dll,1是exe,3是VFT_DRV 驱动程序 
FILESUBTYPE 0xbL    //VFT2_DRV_INPUTMETHOD 输入法驱动程序
BEGIN
  BLOCK "StringFileInfo" //这里设置文件其他的版本信息(详细信息)
  BEGIN
    BLOCK "080403A8"   //所用语言080403A8简体中文
    BEGIN
        VALUE "Comments","Microsoft(R) Windows(R) Operating System"   //备注 
        VALUE "CompanyName","Microsoft(R)\0"           //公司名
        VALUE "FileDescription", "zhu.ime\0"       //产品描述
        VALUE "FileVersion", "1. 0. 0. 1\0"       //文件版本
        VALUE "InternalName", ""               //内部名称
        VALUE "LegalCopyright", "Copyright (C) 2000.01\0" //版权信息
        VALUE "OriginalFilename", "zhu.ime\0"         //源文件名
        VALUE "ProductName", "zhu.ime\0"           //产品名
        VALUE "ProductVersion", "1. 0. 0. 1\0"       //产品版本
    END
  END
  BLOCK "VarFileInfo"
  BEGIN
    VALUE "Translation", 0x804, 0x03A8
  END                    
END
绿色

转载于:https://www.cnblogs.com/cnpler/archive/2012/03/19/2405433.html

Delphi编写ActiveX控件及程序中嵌入word方案 ActiveX控件编写 1.ActiveX控件由来 在创建包括ActiveX程序时,主要的工作就是组件,一个可以自足的在ActiveX网络(现在的网络主要包括 Windows和Mac)中任意运行的程序。这个组件就是ActiveX近控件。ActiveX是Microsoft为抗衡Sun Microsystems的JAVA技术而提出的,此控件的功能和JAVA applet功能类似。 阅读详情

相关推荐

使用Delphi,SDK编写Windows简单程序

        接触Delphi也已经有好长时间了,使用Delphi进行程序开发非常方便、快速,Delphi本身就提供了大量的组件(网上还有更多的组件)进行程序开发,这大大减轻了程序员的工作量,但是越方便越说明Delphi本身在背后为我们做的工作就越多,也许很多人没有考虑过这些,还在充分的享受着它带给我们的快捷与方便。我也是个C的爱好者,学习和使用C也有好长一段时间了,学了C/C++以后,要进

乱弹琴 1787

delphi轻松实现输入法编程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33875839的博客 1109

Delphi中输入法绑定的技巧与实践

Delphi作为一种强大的编程语言,其在输入法绑定技术方面的应用非常广泛且灵活。输入法绑定是确保用户在应用程序中能够舒适、准确地输入文本的关键技术,特别是在多语言环境下。正确地实现输入法绑定不仅可以提高软件的用户体验,还能在一定程度上提高工作效率。本文将概述Delphi输入法绑定技术的基本概念、原理和应用场景,为读者搭建一个坚实的理解基础,进而深入探讨技术实现的细节和优化策略。第三方库的选择对于Delphi项目的成功有着不容忽视的影响。

weixin_28913879的博客 1044

DELPHI下汉字输入法的编程及使用

许多WINDOWS应用程序的中西文录入界面中,中西文的录入需要反复切换汉字输入法,使用起来非常繁琐。笔者在利用DELPHI开发某MIS的过程中,找到了一种比较简捷的解决办法。  本文设计环境为DELPHI CLIENT/SERVER SUIT VER3.0(以下简称DELPHI3.0),中文WINDOWS’95。  一、DELPHI3.0下Imename 、Imemode属性  在DELPHI3.

heyongzhou的专栏 2087

Delphi输入法开发详解与源码实战

随着多语言输入需求的增长,开发高效稳定的输入法程序成为系统级编程的重要方向。Delphi以其强大的Windows API封装能力、高效的编译性能和丰富的VCL控件库,成为实现本地化输入法的理想选择。在技术路线上,Delphi可通过调用Imm32.dll中的输入法管理接口(如ImmCreateContext、ImmAssociateContext等),深度介入Windows IME系统,实现对输入上下文的精确控制。

weixin_35671843的博客 1166

Delphi环境下的输入法编程:汉字与拼音转换实现

本文还有配套的精品资源,点击获取 简介:本话题探讨在Delphi环境下实现汉字与拼音转换的技术。通过动态链接库(DLL)来设计和优化输入法编程,实现通过输入汉字获取拼音或输入拼音首字母获取汉字的功能。核心在于理解汉字与拼音的转换机制,掌握词典文件的读取与解析,以及高效数据结构的应用。同时考虑用户体验,结合Delphi界面元素,创建一个高效的输入法系统。 1. 输入...

weixin_36197669的博客 1557

用Delphi编写安装程序

当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步,同时也是很重要的一步,因为运行安装程序往往是用户做的第一步操作。   很多报刊文章介绍了许多如何利用installshield等工具软件来制作安装程序的方法,这种办法可以很快建立起较常见的安装模式,但用这种办法也有一些不足,如做成的安装程序一般较大;风格较单一;不能灵活的控制启动方式和快捷方式。其实安

醒狮 1243

T9 输入法 Delphi实现 Demo

关于T9输入法的Delphi 实现,代码均来自网络 此为Demo版

Delphi编写输入法程序。。。。。

代码思路原作者,不详.......................膜拜第一位作者的开创思维 本人只是稍作修改和写入一些原作者没有告诉的东西 首先输入法必备的19个接口自己不要删除,不然输入法编译出来安装失败不要狗叫= = 其次输入法的文件类型要设置为驱动,子类型要设置为输入法才能被ImmInstallIME函数安装,不然安装失败不能注入 如何修改参照最下面的方法 ‍-----------...

weixin_30443747的博客 567

微软手写输入支持库及delphi控件与示例

微软鼠标手写输入识别delphi示例,使用方法非常简单。

delphi 自动打开输入法(搜狗)

delphi 自动打开输入法(搜狗) 在一个文本编辑窗口输入时,自动打开中文输入法(热键 Alt+A),默认打开=》【中文 (简体) - 搜狗拼 音输入法】。

Delphi下汉字输入法的编程及使用

  许多Windows应用程序的中西文录入界面中,中西文的录入需要反复切换汉字输入法,这样使用起来非常麻烦,下面来介绍一种比较简便的解决方法。本文的程序设计环境为Delphi Client/Server Suit Ver 3.0(以下简称Delphi 3.0)和中文Windows 95。    1.Delphi下的Imename、Imemode属性    在Delphi 3.0中的

badmichael的专栏 1211

Delphi获取和设置汉字输入法.rar

Delphi 获取系统中已安装的中文输入法,判断是否在中文状态,若是则关闭它,切换半角和全角模式,切换中文标点模式和英文标点模式,并对输入法做相关设置。以下是相关代码:   procedure TForm1.closecid;   var    mycid:hkl;   begin    mycid:=GetKeyBoardLayOut(0);    if ImmIsIME(mycid) then    //判断是否在中文状态,若是则关闭它    immsimulateHotkey(handle,IME_CHotKey_IME_NonIME_Toggle);   end;   procedure TForm1.FormShow(Sender: TObject);   var    j:integer;   begin    for j:=0 to screen.imes.count-1 do    begin    //获取系统中已安装的中文输入法    ComBoBox1.Items.Add(screen.Imes.strings[j]);    end;   end;

看DELPHI看西安就业。。。。

http://www.delphibbs.com/delphibbs/dispq.asp?lid=3512190蓝叶菱(鹧鸪菜)地点:西安简历:Delphi使用了近5年,大小的MIS,通信的,串口图像,组件,做了不少,做过DELPHI培训教师,第一次工作外呢,其他都做小头目领导不过0-3个人(有时这人什么也帮不上),设计软件注重开发效率,设计模式也用了一些。网站也做了一些ASP.ASP.NET

lichaohui的专栏 2210

uniapp原生安卓插件开发之路

声明: 我的功能需求:全局悬浮框,也就是在其他应用上依旧能悬浮。查遍uni文档,无法实现,甚至native.js也无法实现,无奈只能走上原生插件开发这条不归路了。(吐槽:天天写前端js,突然写了下android简直要炸,public static String啥的,var不香嘛,不过别人严谨肯定还是有别人道理的,加油吧,争取能入个门!) 本人不懂安卓开发,完全安卓小白,所以安卓方面可能表达的不是很好,安卓代码可能写的不优美,但我功能最终还是实现了。但是为了需求,能力总能被“逼”出来。有描述错误的还望指正

Jone's Area 1万+

MagicDraw-需求图

MagicDraw学习笔记

木头征的博客 4136

用Delphi编写Win2000服务程序

用Delphi编写Win2000服务程序 摘要:本文介绍用Delphi编写Win2000服务程序,所涉及到的类是TServiceApplicatoin,TService,TServiceThread等。  关键字: Service/服务 一、Win2000服务简介服务程序(Service Application)是一种运行于WinNT的后台程序,每个服务程序(Ser

hero_li的专栏 834

K210开发板学习笔记(三)——STM32+K210+SD卡实现人脸识别(完整K210代码)

更新日记:2022年4月26日 更新了串口通信部分的内容,本文写的略为粗糙,恐有不当之处,希望大家不吝赐教。 人脸识别 一、MaixPy IDE开发 参考博主晨少hc的博文(https://blog.youkuaiyun.com/HuangChen666/article/details/113995079)来实现人脸识别功能,我用的硬件是亚博智能的K210开发板,在配置工程中有几步和这个博主的不一样,需要注意。 所需要的文件有:模型文件),脚本文件,ide需要的bin文件...

Embedded learner的博客 4万+

在DELPHI中HOOK程序的编写

====================================================== 注:本文源代码点此下载 ====================================================== 在delphi中hook程序的编写在编写windows应用程序的时候,有时候我们希望所编写的程序可以捕获用户的某一个特定的动作(比如是否按下鼠标右

javazhuanzai的专栏 304

Starlink地面终端天线对星(一)对星流程,星历下载,信标信号

starlink卫星终端对星采用机械伺服+相控阵电子扫描的混合模式,兼顾快速盲扫和高精度跟踪;对星流程分三步:冷启动与盲捕获 → 建立初始链路并下载星历 → 进入正常通信模式;

chen2jiang3的博客 2725

放弃FFT全频计算!在STM32F407上用DFT单点计算提速50%的优化技巧

本文详细介绍了在STM32F407上通过DFT单点计算实现比FFT快50%的优化技巧,特别适用于生物阻抗分析、振动监测等只需关注单一频点的嵌入式场景。通过预计算相位角、查表法和混合精度计算等策略,显著提升计算效率和内存利用率,同时保持高精度。

weixin_28738397的博客 194
上一篇: Null value was assigned to a property of primitive type setter of“原因及解决方法
jozosoft
博客等级 码龄22年 10粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值