用户可能通过点击输入法对话框上的“月亮/太阳”进行切换,还可以通过热键进行“全/半角”的切换。
请问:不管是通过哪一种方式进行切换,只要“全/半角”一变化,就能捕获,并进行处理。

解决方案 »

  1.   

    我知道输入法改变的消息是“WM_INPUTLANGCHANGEREQUEST”
    请问“半/全角”改变的消息是什么?
    如果没有该消息,那怎么处理?
      

  2.   

    关注一下,呵呵。
    个人感觉全角和半角的切换已经是输入法本身的操作,和windows消息没有关系了吧。
      

  3.   

    type
      TMyEdit = class(TEdit)
        procedure IMEMsg(var Msg: TMessage); message WM_IME_NOTIFY ;
      end;  { TMyEdit }procedure TMyEdit.IMEMsg(var Msg: TMessage);
    begin
      inherited;
      if Msg.wParam = IMN_SETCONVERSIONMODE then
      begin
        if (Perform(WM_IME_CONTROL, IMC_GETCONVERSIONMODE, 0) and IME_CMODE_FULLSHAPE) <> 0 then
          Showmessage('1')
        else
          ShowMessage('0');
      end;
    end;就是其中的IMC_GETCONVERSIONMODE报错,说是未定义:(
      

  4.   

    >>就是其中的IMC_GETCONVERSIONMODE报错,说是未定义:(
    那你这代码怎么用能呀?
      

  5.   

    >>就是其中的IMC_GETCONVERSIONMODE报错,说是未定义:(
    那你这代码怎么用能呀?
    我这不也等着高人指点呢吗
      

  6.   

    >>就是其中的IMC_GETCONVERSIONMODE报错,说是未定义:(
    那你这代码怎么用能呀?
    我这不也等着高人指点呢吗
    ===============================
    关键是你这些代码是哪里找到的呀?
      

  7.   

    那些代码是我自己查资料写的,在打开输入法,切换全角半角时的确可以触发那个消息,就是不知道IMC_GETCONVERSIONMODE的值,才导致频繁的showmessage
      

  8.   

    关于IMC_GETCONVERSIONMODE的值,我现在VC版上请教高手。http://community.csdn.net/Expert/topic/3896/3896446.xml?temp=.2845423
      

  9.   

    IMC_GETCONVERSIONMODE好象是等于1呢
    我把它定义为1后,可以正常运行呢
      

  10.   

    我这里怎么不行?
      if Msg.wParam = IMN_SETCONVERSIONMODE then
      begin
        if (Perform(WM_IME_CONTROL, 1, 0) and IME_CMODE_FULLSHAPE) <> 0 then
          Showmessage('1')
        else
          ShowMessage('0');
      end;这样在打开输入法,还有切换全角半角的时候都是show个0出来。
    另外说一下,我的输入法是紫光
      

  11.   

    程序自己应该捕捉不到的,要用全局的hook之类才能得到,
    就我所知,程序自己只能得到输入法打开关闭的消息
      

  12.   

    API函数:BOOL ImmSimulateHotKey(HWND hWnd,DWORD dwHotKeyID);//模拟热键其中Hwnd为程序窗口的句柄,dwHotHKeyID为模拟的热键,若成功则返回True
    immsimulateHotkey(handle,
      IME_CHotKey_shape_Toggle);//切换半角和全角模式
      

  13.   

    Tedit、Tmemo、TmaskEdit等编辑元件在应用程序中经常使用,这三种元件都具有ImeName、ImeMode属性。其中ImeName属性是输入法名称,在对象观察器中对应一个包括当前系统中所有汉字输入法的下拉组合框;ImeMode属性是输入法模式,在对象观察器中也对应一个下拉组合框,组合框中包含imClose、imOpen、imChinese、imDontCare、imSAlpha、imAlpha六项内容。 
      imClose 表示输入法处于关闭状态; 
      ImOpen 表示输入法处于打开状态; 
      ImChinese 表示处于中文输入法状态; 
      ImDontCare 表示若输入法处于关闭状态则打开最近一次使用过的输入法; 
      ImSAlpha 表示输入处于半角状态; 
      ImAlpha 表示输入处于全角状态。
      

  14.   

    unit mainForm;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Clipbrd, JPEG;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Edit1: TEdit;
        Memo1: TMemo;
        Button1: TButton;
        procedure FormShow(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        FHEdit: TWndMethod;
        procedure EditWndProc(var Message: TMessage);
        function CaptureScreen:TBitmap;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses U_ClipBoard;{$R *.dfm}procedure TForm1.EditWndProc(var Message: TMessage);
    var
      i: Integer;
      strClipBrd, strReplaced: string;
      TmpStream: TStream;
    begin
      case message.Msg of
        WM_PASTE:
        begin
          if Clipboard.HasFormat(CF_TEXT) then
          begin
            strClipBrd := Clipboard.AsText;
            for i := 1 to Length(strClipBrd) do
              if Ord(strClipBrd[i]) < $A1 then
                strReplaced := strReplaced + strClipBrd[i];
            Clipboard.AsText := strReplaced;
            FHEdit(Message);
            Clipboard.AsText := strClipBrd;
            Exit;
          end;
        end;
        WM_KEYDOWN:
        begin    end;
        WM_KEYUP:
        begin    end;
        WM_CHAR:
        begin 
          if Message.WParam >= $A1 then Message.WParam := 0;
        end;
      end;
      FHEdit(Message);
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
      FHEdit := Edit1.WindowProc;
      Edit1.WindowProc := EditWndProc;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      bmp: TBitmap;
    begin
      try
        bmp := TBitmap.Create;
        bmp.Assign(CaptureScreen);
        bmp.SaveToFile('c:\12.bmp');
      finally
        bmp.Free;
      end;
    end;function TForm1.CaptureScreen:TBitmap;
    var 
      DC : HDC;
      ABitmap:TBitmap;
    begin 
      DC := GetDC (GetDesktopWindow); 
      ABitmap:=TBitmap.Create;
      try
        ABitmap.Width := GetDeviceCaps (DC, HORZRES);
        ABitmap.Height := GetDeviceCaps (DC, VERTRES);
        BitBlt(ABitmap.Canvas.Handle, 0, 0, ABitmap.Width,
        ABitmap.Height,DC, 0, 0, SRCCOPY);
      finally
       ReleaseDC(GetDesktopWindow, DC);
      end;
      Result:=ABitmap;
    end; end.
      

  15.   

    unit U_ClipBoard;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls, Clipbrd, JPEG;procedure ClipBrdToPict(const FileName: string);implementationprocedure ClipBrdToPict(const FileName: string);
    var
      jpg: TJPEGImage;
      bmp: TBitmap;
    begin
      bmp := TBitmap.Create;
      try
        bmp.Assign(Clipboard);
        jpg := TJPEGImage.Create;
        try
          jpg.Assign(bmp);
          jpg.CompressionQuality := 80;
          jpg.Compress;
          jpg.SaveToFile(FileName);
        finally
          jpg.Free;
        end;
      finally
        bmp.Free;
      end;
    end;end.
      

  16.   


    *************************摘自JackySoft技朮大全**********************************
    ************http://home.91i.net/jackysoft/database/download.htm*****************用DELPHI设计屏幕保护程序   
    屏幕保护程序是一类特殊的WINDOWS程序。如果已安装了屏幕保护程序,超过等待时间没有鼠标和键盘操作,WINDOWS会自动运行屏幕保护程序以保护屏幕。在休息之余,欣赏一下漂亮的WINDOWS屏幕保护,使人赏心悦目。那么设计屏幕保护程序要注意哪些方面?由于屏幕保护程序需满足一些特殊条件,比如屏幕保护程序只能有一个实例运行,运行后一旦使用鼠标或键盘应立即结束程序,能接受参数等。设计屏幕保护程序要充分考虑到这些,本文探讨用DELPHI制作一个屏幕保护程序(以下简称SCR),最后给出一个可运行的实例。----一、TCanvas与TBitMap对象、JPEG对象: 
    ----DELPHI的TCanvas封装了大部分WINDOWS对图形的操作,SCR运行时各种图像千变万化、图形变幻无不是TCanvas的"杰作"。TBitMap对象有一个LoadFromFile()方法,能从BMP图像文件取得位图。一般情况下,设计SCR要创建至少一个TBitMap对象,由于窗体和TBitMap对象都有Canvas属性,可利用TCanvas中的各种函数设计图像。设计一个有各种图像变化效果的SCR常用到以下函数:----1、CopyRect方法:从其原型CopyRect(Dest:TRect;Canvas:TCanvas;Source:TRect)可看出,它将源画布某一矩形区域的图像复制到另一个画布的矩形区域。由于是内存的成块复制,因此具有很高的执行效率。在Timer组件的OnTimer事件程序中灵活使用该函数,可以设计出各种美观演示效果:如百叶窗、推拉、马赛克、随机线、反像等等。将以下代码加入到OnTimer事件程序,可演示各种图像效果,这里仅举出两种效果,读者可参考有关资料设计更多更漂亮的演示效果。
    ......
    case PlayMode of 
    0:begin //从左向右移动(设x初值为Screen.Width) 
    x:=x-10;
    SCRSaverFrom.CopyRect(Rect(x,0,x+10,Screen.Height),Bit.Canvas,Rect(x,0,x+10,Screen.Height));
    if x=0 then ChangePictureAndPlayMode;//改变图像及演示模式
    end;
    1:begin //马赛克
    for i:=0 to Screen.Width*Screen.Height div 10 do
    begin
    j := Random(Screen.Width div 4)*4;
    k := Random(Screen.Height div 4)*4;
    SCRSaverFrom.CopyRect(Rect(j,k,j+4,k+4),Bit.Canvas,Rect(j,k,j+4,k+4));
    end;SCRSaverFrom.CopyRect(Rect(0,0,Screen.Width,Screen.Height),Bit.Canvas,Rect(0,0,Screen.Width,Screen.Height));
    ChangePictureAndPlayMode; //改变图像及演示模式
    end;
    2: ......
    ......
    end;----2、StretchDraw方法:一般说来,使用CopyRect方法要求源矩形与目的矩形应相等,如果两者尺寸相差太大时,色彩可能失真。使用StretchDraw能避免这个问题,其原型为:StretchDraw(constRect:TRect;Graphic:TGraphic)。它可在画布指定的矩形区域内完整地“画”出一个图像,如果源图象区域与目的区域尺寸不一致,会自动Stretch(拉伸),能有效的避免色彩失真。但此函数只能"画"出整个图像,如果只需“画”出一部分图像则应配合CopyRect()使用,先用StretchDraw()使整幅位图变形"输出到一个画布,然后再用CopyRect()函数将所需部分“画出”。----3、TextOut方法:在指定的位置输出一串文字。在Canvas中还有很多函数可绘制图形,也能用于SCR的设计,这里就不加介绍。----4、支持JPEG图像。由于JPEG图像格式具有很好的压缩性能,是最常用的图像格式之一。DELPHI3/4中新加入了对JPEG图像的支持,JpegImage是TGraphic的派生类,它的LoadFromFile方法可从JPEG文件取出一幅图像,JpegImage没有Canvas属性,不能用CopyRect()方法,但其它画布可用StretchDraw()方法显示出一个JPEG图像,就将JPEG图像转换成位图。请看下面例子,其中Bit为全局的TBitMap对象。注意:使用JpegImage应在USES中加入JPEG单元。 
    procedure LoadBMPFromJPEG(JPEGFileName:String); 
    // 从JPEG 文 件 中 取 图 像
    var JpegImage1:TJpegImage;
    begin
    JpegImage1 := TJpegImage.Create;
    JpegImage1.LoadFromFile(JPEGFileName);
    Bit.Width := JpegImage1.Width ;
    // 使 位 图 与JPEG 图 像 尺 寸 相 等 
    Bit.Height := JpegImage1.Height ; 
    Bit.Canvas.StretchDraw(Rect(0,0,Bit.Width,Bit.Height),JpegImage1);
    JpegImage1.Free ;
    end;----二、MediaPlayer和Timer组件:
    ----MediaPlayer组件封装了MCI中绝大部分的功能,利用它很容易播放WAVE和
    MIDI音乐,为SCR添加美妙的背景音乐。有关代码如下: 
    ifMediaPlayer1.Mode<>mpPLayingthen 
    //音乐播放完后,更换音乐 
    begin 
    inc(i); 
    MediaPlayer1.FileName:=IntToStr(i)+`.WAV`; 
    //逐一播放1.wav,2.wav... 
    MediaPlayer1.Open; 
    MediaPlayer1.Play;
    end;
    ----Timer组件是一个定时器,它的Interval属性指定定时器的间隔时间,每隔指定的时间就会执行一次OnTimer事件,SCR的OnTimer事件内要完成演示图像,更换图像,检查音乐是否播放完毕,更换音乐等各项工作。因此,Timer是设计SCR程序必不可少的组件。