就是类似于VB中SendKeys的东西,往当前激活的应用程序发送一串字符串(类似于虚拟键盘消息)
DDG上面有个用Delphi实现SendKeys的例子,但那个不支持双字节。
我研究了一下源码,发现那个似乎是把那串字符最后还是翻译成了WM_KeyDown之类的消息,这样当然没办法支持双字节。而输入法之类的东西总有办法的吧?比如智能ABC,不就是一次把你输好的一串文字发给窗体的吗?
有没有人知道这个东西怎么做?
DDG上面有个用Delphi实现SendKeys的例子,但那个不支持双字节。
我研究了一下源码,发现那个似乎是把那串字符最后还是翻译成了WM_KeyDown之类的消息,这样当然没办法支持双字节。而输入法之类的东西总有办法的吧?比如智能ABC,不就是一次把你输好的一串文字发给窗体的吗?
有没有人知道这个东西怎么做?
handle
function GetFocusedWindowFromParent(ParentWnd:HWnd):HWnd;
var
OtherThread,
Buffer : DWord;
idCurrThread: DWord;
begin
OtherThread := GetWindowThreadProcessID(ParentWnd, @Buffer);
idCurrThread := GetCurrentThreadID;
if AttachThreadInput(idCurrThread, OtherThread, true) then begin
Result := GetFocus;
AttachThreadInput(idCurrThread, OtherThread, false);
end
else
Result:= GetFocus;
end;//获得当前获得焦点的子窗体,即使它是其他应用程序的窗体
function GetFocusedChildWindow: HWnd;
begin
Result := GetFocusedWindowFromParent(GetForegroundWindow);
end;procedure TForm1.Timer1Timer(Sender: TObject);
var
h:thandle;
begin
h:= GetFocusedChildWindow;
sendmessage(h,WM_SETTEXT,Length(edit1.text), LongInt(PChar(Trim(edit1.text))));end;
不过后面我觉得用WM_IME_CHAR比用WM_SetText要好:)
var
OtherThread,
Buffer: DWord;
idCurrThread: DWord;
begin
OtherThread:= GetWindowThreadProcessID(ParentWnd, @Buffer);
idCurrThread:= GetCurrentThreadID;
if AttachThreadInput(idCurrThread, OtherThread, True) then
begin
Result:= GetFocus;
AttachThreadInput(idCurrThread, OtherThread, False);
end
else
Result:= GetFocus;
end;procedure SendKeys (S: string);
const
SleepTime = 50;
var
Handle: HWND;
L, I: Integer;
Char: Integer;
begin
Sleep (SleepTime);
Handle:= GetActiveControl(GetForegroundWindow);
L:= Length(S);
I:= 0;
while I<L do
begin
Inc (I);
Char:= Byte(S[I]);
if (Char>127) and (I<L) then
begin
Inc (I);
Char:= Char shl 8;
Inc (Char, Byte(S[I]));
end;
case Char of
10, 13:
begin
keybd_event (vk_Return, 0, 0, 0);
keybd_event (vk_Return, 0, KEYEVENTF_KEYUP, 0);
Sleep (SleepTime);
Handle:= GetActiveControl(GetForegroundWindow);
end;
9:
begin
keybd_event (vk_Tab, 0, 0, 0);
keybd_event (vk_Tab, 0, KEYEVENTF_KEYUP, 0);
Sleep (SleepTime);
Handle:= GetActiveControl(GetForegroundWindow);
end;
else
SendMessage (Handle, WM_IME_Char, Char, 1);
end;
end;
end;