• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Delphi拦截输入法输入结果

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
{
  拦截输入法输入的字符串。向编辑框中输入中文查看效果。
  Delphi XE7
}

unit Unit1;

interface

uses
    Winapi.Windows,
    Winapi.Messages,
    System.SysUtils,
    System.Variants,
    System.Classes,
    Vcl.Graphics,
    Vcl.Controls,
    Vcl.Forms,
    Vcl.Dialogs,
    Vcl.StdCtrls,
    Winapi.Imm;

type
    TForm1 = class( TForm )
        edt1 : TEdit;
        procedure FormCreate( Sender : TObject );
        private
            { Private declarations }
        public
            { Public declarations }
    end;

var
    Form1       : TForm1;
    DestHwnd    : HWND;
    DestWinPorc : Pointer;

implementation

{$R *.dfm}

procedure OnWM_IME_COMPOSITION( HWND, msg, wParam, lParam : longint );
var

    ResultStr : string;
    hIMC      : Integer;
    dwSize    : Integer;
    StrLength : Integer;
begin
    if ( lParam and GCS_RESULTSTR ) <> 0 then
        begin
            // 先获取当前正在输入的窗口的输入法句柄
            hIMC := ImmGetContext( Form1.edt1.Handle );
            // 先将ImmGetCompositionString的获取长度设为0来获取字符串大小.
            dwSize := ImmGetCompositionString(
                hIMC,
                GCS_RESULTSTR,
                nil,
                0 );

            // 缓冲区大小要加上字符串的NULL结束符大小,
            // 考虑到UNICODE
            StrLength := dwSize div Integer( sizeof( Char ) );
            OutputDebugString( PWideChar( IntToStr( Length( ResultStr ) ) ) );
            SetLength(
                ResultStr,
                StrLength );
            OutputDebugString( PWideChar( ResultStr ) );
            // 再调用一次.ImmGetCompositionString获取字符串
            ImmGetCompositionString(
                hIMC,
                GCS_RESULTSTR,
                PChar( ResultStr ),
                dwSize );
            // 现在ResultStr里面即是输入的汉字了。
            OutputDebugString( '-------------------' );
            OutputDebugString( PWideChar( ResultStr ) );
            OutputDebugString( '-------------------' );
            ImmReleaseContext(
                HWND,
                hIMC );
        end;

end;

function WinProc( HWND, msg, wParam, lParam : longint ) : LRESULT; stdcall;
begin
    case msg of
        WM_IME_COMPOSITION :
            OnWM_IME_COMPOSITION( HWND, msg, wParam, lParam );
    end;
    result := CallWindowProc(
        DestWinPorc,
        HWND,
        msg,
        wParam,
        lParam );
end;

procedure TForm1.FormCreate( Sender : TObject );
begin
    DestHwnd    := Self.edt1.Handle;
    DestWinPorc := Pointer( GetWindowLong( Self.edt1.Handle, GWL_WNDPROC ) );
    SetWindowLong(
        DestHwnd,
        GWL_WNDPROC,
        longint( @WinProc ) );
end;

end.

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
CENTOS6 下MATLAB2014b的安装和破解(Matlab_R2014b linux版 安装笔记) ...发布时间:2022-07-18
下一篇:
Windows64bit安装MATLAB R2014a发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap