键盘模拟问题(不可能的任务给100分) form1上有memo和edit,如何使得在edit上产生的所有键盘输入(包括A,B,C,...和各种控制符(回车,换行等),或者shift+/(组合键得到字符?))在memo上得到完全的模拟,最后效果是memo上的text和edit上的text是一样的。 希望大家给出完整过程。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 text是一样的就很简单OnChange中Memo.Text:=Edit.Text procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin Memo1.Perform(WM_CHAR, WParam(Key), 0);end; ly_liuyang(Liu Yang),我要的是实现上述过程的算法,而不是程序表现出来的结果 forgetter() 的方法解决不了控制符问题 getkeytext里每次keypress时间都捕捉,然后把取得的字符add到memo不就完了吗?我好像不太懂你的问题 我给你一个例证好好看看:unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Button2: TButton; Button4: TButton; Edit2: TEdit; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Edit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementationuses ShellAPI;{$R *.DFM}procedure SendShift(H: HWnd; Down: Boolean);var vKey, ScanCode: Word; lParam: longint;begin vKey:= $10; ScanCode:= MapVirtualKey(vKey, 0); lParam:= longint(ScanCode) shl 16 or 1; if not(Down) then lParam:= lParam or $C0000000; SendMessage(H,WM_KEYDOWN, vKey, lParam);end;procedure SendCtrl(H: HWnd; Down: Boolean);var vKey, ScanCode: Word; //wParam lParam: longint;begin vKey:= $11; ScanCode:= MapVirtualKey(vKey, 0);{虚拟键转换为扫描码} lParam:= longint(ScanCode) shl 16 or 1; if not(Down) then lParam:= lParam or $C0000000; SendMessage(H,WM_KEYDOWN, vKey, lParam);end;procedure SendKey(H: Hwnd; Key: char);var vKey, ScanCode, wParam: Word; lParam, ConvKey: longint; Shift, Ctrl: boolean;begin ConvKey:= OemKeyScan(ord(Key)); Shift:= (ConvKey and $00020000) <> 0; Ctrl:= (ConvKey and $00040000) <> 0; ScanCode:= ConvKey and $000000FF or $FF00; vKey:= ord(Key); wParam:= vKey; lParam:= longint(ScanCode) shl 16 or 1; if Shift then SendShift(H, true); if Ctrl then SendCtrl(H, true); SendMessage(H, WM_KEYDOWN, vKey, lParam); SendMessage(H, WM_CHAR, vKey, lParam); lParam:= lParam or $C0000000; SendMessage(H, WM_KEYUP, vKey, lParam); if Shift then SendShift(H, false); if Ctrl then SendCtrl(H, false);end;procedure TForm1.Button1Click(Sender: TObject);var pt: TPoint;begin pt:= edit1.ClientToScreen( Point( 4,4 )); SetCursorPos( pt.x, pt.y ); mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );end;procedure TForm1.Button2Click(Sender: TObject);begin SendMessage(edit1.Handle,WM_LBUTTONDOWN ,0,0);end;procedure TForm1.Button4Click(Sender: TObject);begin SendKey(edit1.handle, 'T'); SendKey(edit1.handle, 'e'); SendKey(edit1.handle, 's'); SendKey(edit1.handle, 't');end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin SendKey(edit2.Handle, Key);end;end. forgetter() 你敲个在edit那里敲个;号,memo里只会出现? coolfilm(苏飞工作室) 的方法解决了大部分问题,但像del,insert之类的键就没办法了 forgetter() 你的办法跟coolfilm(苏飞工作室)的效果一样,刚才错怪你了,不好意思 但是你们的方法对于以下一些情况没用 比如按左右键光标移动 比如按delete键,Insert键 procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);begin Memo1.Perform(WM_CHAR, WParam(Key), 0);end;procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);begin Memo1.Perform(WM_KEYDOWN, WParam(Key), 0);end;procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);begin Memo1.Perform(WM_KEYUP, WParam(Key), 0);end; Keybd_Event(Byte(VK_ESCAPE),KEYEVENTF_KEYUP,0,0);上面的命令就是模拟按下ESC键,但是实际并没有按下。 Delphi 调用Web Service接口,出错?求教!!! DBGridEH与XPManifest的问题 请问高手,怎样读写网络某台主机上的(指定)文件?急急急,在线等!!!有分加!!! 一个最基本的知识 如何从原有的DBGrid内重定义需要显示的字段及长度和显示的Caption. 高兴散分:第一次拿到加班费! 关于DCOM,com+程序的发布的问题,请教高手 -------100分求助﹗關于QuickReport設定打印起始與終止頁的問題-------- delphi使用问题 在delphi里做一个字段》300条的数据库表 D6使用D5编译的DCU问题请教 高手救命
OnChange中
Memo.Text:=Edit.Text
begin
Memo1.Perform(WM_CHAR, WParam(Key), 0);
end;
text里每次keypress时间都捕捉,然后把取得的字符add到memo不就完了吗?
我好像不太懂你的问题
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Button4: TButton;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation
uses ShellAPI;
{$R *.DFM}procedure SendShift(H: HWnd; Down: Boolean);
var
vKey, ScanCode: Word;
lParam: longint;
begin
vKey:= $10;
ScanCode:= MapVirtualKey(vKey, 0);
lParam:= longint(ScanCode) shl 16 or 1;
if not(Down) then
lParam:= lParam or $C0000000;
SendMessage(H,WM_KEYDOWN, vKey, lParam);
end;procedure SendCtrl(H: HWnd; Down: Boolean);
var
vKey, ScanCode: Word; //wParam
lParam: longint;
begin
vKey:= $11;
ScanCode:= MapVirtualKey(vKey, 0);{虚拟键转换为扫描码}
lParam:= longint(ScanCode) shl 16 or 1;
if not(Down) then
lParam:= lParam or $C0000000;
SendMessage(H,WM_KEYDOWN, vKey, lParam);
end;procedure SendKey(H: Hwnd; Key: char);
var
vKey, ScanCode, wParam: Word;
lParam, ConvKey: longint;
Shift, Ctrl: boolean;
begin
ConvKey:= OemKeyScan(ord(Key));
Shift:= (ConvKey and $00020000) <> 0;
Ctrl:= (ConvKey and $00040000) <> 0;
ScanCode:= ConvKey and $000000FF or $FF00;
vKey:= ord(Key);
wParam:= vKey;
lParam:= longint(ScanCode) shl 16 or 1;
if Shift then SendShift(H, true);
if Ctrl then SendCtrl(H, true);
SendMessage(H, WM_KEYDOWN, vKey, lParam);
SendMessage(H, WM_CHAR, vKey, lParam);
lParam:= lParam or $C0000000;
SendMessage(H, WM_KEYUP, vKey, lParam);
if Shift then SendShift(H, false);
if Ctrl then SendCtrl(H, false);
end;procedure TForm1.Button1Click(Sender: TObject);
var
pt: TPoint;
begin
pt:= edit1.ClientToScreen( Point( 4,4 ));
SetCursorPos( pt.x, pt.y );
mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
mouse_event( MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 );
mouse_event( MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 );
end;procedure TForm1.Button2Click(Sender: TObject);
begin
SendMessage(edit1.Handle,WM_LBUTTONDOWN ,0,0);
end;procedure TForm1.Button4Click(Sender: TObject);
begin
SendKey(edit1.handle, 'T');
SendKey(edit1.handle, 'e');
SendKey(edit1.handle, 's');
SendKey(edit1.handle, 't');
end;procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
SendKey(edit2.Handle, Key);
end;end.
但是你们的方法对于以下一些情况没用
比如按左右键光标移动
比如按delete键,Insert键
begin
Memo1.Perform(WM_CHAR, WParam(Key), 0);
end;procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Memo1.Perform(WM_KEYDOWN, WParam(Key), 0);
end;procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Memo1.Perform(WM_KEYUP, WParam(Key), 0);
end;