在用输入法输入汉字时,我们可以用快捷键:ctrl+.  来转换标点符号的中英两中状态,我想在程序中通过虚拟按键的方法来实现,现在我通过api已经实现了,代码如下:procedure TFinput.RadioButton7Click(Sender: TObject);
var
  h: HIMC;
  fdwConversion,
    fdwSentence: DWord;
begin
  h := ImmGetContext(Handle);
  if h <> 0 then
    if ImmGetConversionStatus(h, fdwConversion, fdwSentence) then
      ImmSetConversionStatus(h, (IME_CMODE_SYMBOL), fdwSentence);
  listbox1.OnClick(listbox1);end;procedure TFinput.RadioButton8Click(Sender: TObject);
var
  h: HIMC;
  fdwConversion,
    fdwSentence: DWord;
begin
  h := ImmGetContext(Handle);
  if h <> 0 then
    if ImmGetConversionStatus(h, fdwConversion, fdwSentence) then
      ImmSetConversionStatus(h, fdwConversion and (not IME_CMODE_SYMBOL), fdwSentence);
  listbox1.OnClick(listbox1);
end;但用上面的代码来做,有一个问题我不知该怎么办,也就是用上面的代码来控制标点符号中英状态的时候,我原来已经设定好的全半角(就是输入法工具条中满圆和月牙形状态的那个)状态又会牵连,不知该怎办,请求帮助

解决方案 »

  1.   

    贴出来共享一下吧!在delphi 7+xp下通过:-)
    procedure apply;
    var
      h: HIMC;
      fdwConversion,
        fdwSentence: DWord;
    begin
      with finput do
      begin
        h := ImmGetContext(Handle);
        if h <> 0 then
        begin
          if ImmGetConversionStatus(h, fdwConversion, fdwSentence) then
          begin
          //中文+全角+英文标点
            if rbzw.Checked and rbqj.Checked and rbfhyw.Checked then
            begin
              ImmSetConversionStatus(h, 2057, fdwSentence);
            end;
          //中文+半角+中文标点
            if rbzw.Checked and rbbj.Checked and rbfhzw.Checked then
            begin
              ImmSetConversionStatus(h, 3073, fdwSentence);
            end;
          //中文+全角+中文标点
            if rbzw.Checked and rbqj.Checked and rbfhzw.Checked then
            begin
              ImmSetConversionStatus(h, 3081, fdwSentence);
            end;
          //中文+半角+英文标点
            if rbzw.Checked and rbbj.Checked and rbfhyw.Checked then
            begin
              ImmSetConversionStatus(h, 2049, fdwSentence);
            end;
          //英文+全角+英文标点
            if rbyw.Checked and rbqj.Checked and rbfhyw.Checked then
            begin
              ImmSetConversionStatus(h, 8, fdwSentence);
            end;
          //英文+半角+中文标点
            if rbyw.Checked and rbbj.Checked and rbfhzw.Checked then
            begin
              ImmSetConversionStatus(h, 1024, fdwSentence);
            end;
          //英文+全角+中文标点
            if rbyw.Checked and rbqj.Checked and rbfhzw.Checked then
            begin
              ImmSetConversionStatus(h, 1032, fdwSentence);
            end;
          //英文+半角+英文标点
            if rbyw.Checked and rbbj.Checked and rbfhyw.Checked then
            begin
              ImmSetConversionStatus(h, 0, fdwSentence);
            end;
          end;
        end;
      end;
    end;
      

  2.   

    To:zwb666(zwb)、masterjames(james) 
    谢谢两位支持,问题已经被我自己解决了,该结贴了,分给两位平分了,希望小弟以后遇到了什么难题,请多多帮忙!