我用到了一个dhtmledit控件(一般操作系统都有:C:\Program Files\Common Files\Microsoft Shared\Triedit\DHTMLED.OCX ),我用该控件来进行html的编辑,
现在问题是在编辑内容时按下的回车键不是对文本进行换行,而是该控件进行了别的操作(进行html分段),只有按下shift+回车键才是对文本进行换行,我想实现的就是当在编辑内容的时候按下回车键后系统能自动发送 shift+回车键 组合键
用过formkeydown和FormKeyDown都不不行现在用如下办法也不行type
 ...
  private
    { Private declarations }
    procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
  public
    { Public declarations }
  end;
var
  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := ApplicationMessage;//截获应用程序消息进行处理
end;procedure TForm1.ApplicationMessage(var Msg: TMsg;
  var Handled: Boolean);
var
  ShiftState: TShiftState;
  KeyState: TKeyboardState;
begin
  case Msg.Message of
    WM_KEYDOWN:
    BEGIN
      case Msg.wParam of
        VK_RETURN: //截获回车键
          begin
            GetKeyboardState(KeyState); //获取键盘状态
            ShiftState := KeyboardStateToShiftState(KeyState);
            if ShiftState =[] then  //判断是否按下shift键
            begin
              KeyState[VK_SHIFT] :=1; //设置shift状态
              SETKEYBOARDSTATE(KeyState);//设置取键盘状态
            end;//            msg.wParam := 0;
//            keybd_event(vk_shift,   0,   0,   0);
//            keybd_event(VK_RETURN,   0,   0,   0);
//            keybd_event(VK_RETURN,   0,   2,   0);
//            keybd_event(vk_shift,   0,   2,   0);
//            postmessage(DHTMLEdit1.Handle,wm_keydown,VK_RETURN,0);
//            postmessage(DHTMLEdit1.Handle,wm_keyup,VK_RETURN,0);
          end;
      end;
    END;
  end;
end;
end.

解决方案 »

  1.   

    楼上的朋友,有什么办法在我按下enter按键时,能自动的转换为shift + enter吗
      

  2.   

    這樣就好了 
              if ShiftState =[] then  //判断是否按下shift键
                begin
                  keybd_event(vk_shift,   0,   0,   0);
                end;
    就不要再
      keybd_event(vk_shift,   0,   2,   0);
    因為這樣,dhtmledit控件 最終收到的只是回車鍵而已。至于什么時候回復shift狀態,你可以把代碼改成這樣:
        keybd_event(vk_shift,   0,   0,   0);     
        sendmessage(dhtmledit.Handle,wm_keydown,vk_Return,0);   
        keybd_event(vk_shift,   0,   2,   0);   
      

  3.   

    删除你的事件:procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
    单击dhtmledit控件,在它的OnKeyPress事件下写如下代码即可:
    IF (GetKeyState(VK_Shift) and 128)=128 THEN EXIT;
    if (Key=#13) then
     begin
      Key:=#0;
      keybd_event(VK_Shift,0,0,0);
      keybd_event(VK_RETURN,0,0,0);
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
    keybd_event(VK_Shift,0,KEYEVENTF_KEYUP,0);
     end;
    注意你的承诺。
      

  4.   

    keybd_event(VK_Shift,0,0,0); 
    keybd_event(VK_RETURN,0,0,0); 
    keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); 
    keybd_event(VK_Shift,0,KEYEVENTF_KEYUP,0);
    可以。
      

  5.   

    to: mwy654321 大侠你的方法我之前试过了,dhtmledit控件没有OnKeyPress事件,
    只有OnOnKeyPress事件、OnOnKeyDown事件、OnOnKeyUp事件(注意都是多了一个on)
    而且OnOnKeyPress事件没有Key参数(别的delphi自带控件的OnKeyPress事件就有),你可以安装该控件试一下,
    在C:\Program Files\Common Files\Microsoft Shared\Triedit\DHTMLED.OCX 有该控件to:zhao_yong 
    你的方法我也试过,没有效果
      

  6.   

    这并不难,只要熟悉dhtml的机制就容易了.我已经把解决办法写到了我的博客.
    http://blog.csdn.net/ideation_shang/archive/2009/01/16/3798082.aspx