如何使用SendMessage发送按键组合,例如:Ctrl+A 如何使用SendMessage发送按键组合,例如:Ctrl+A解决后立即给分 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 var hwnd : Integer;begin hwnd := FindWindow('Notepad', nil); SetForegroundWindow(hwnd); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0); keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)end; 试用 keybd_event 我会,我要的是SendMessage var hwnd : Integer;begin hwnd := FindWindow('Notepad', nil); SetForegroundWindow(hwnd); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0); keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)end; hwnd := FindWindow('notepad', nil); SendMessage(hwnd, WM_COMMAND, 7, 0); 好象是不能一次发的你可以这样 先设定ctrl键的状态为按下状态 函数忘记了 然后SendMessage(hwnd, WM_KEYDOWN, 'a', 0); --------------第一种方法------------这种方法在中文输入法打开的情况下中西文都正常,但我不想用这种费事的办法.------------------------------------//模拟按键函数procedure TForm1.SendKeys(sSend:string);var i:integer; Sstr:string; focushld,windowhld:hwnd; threadld:dword; ch: byte;begin windowhld:=GetForegroundWindow; threadld:=GetWindowThreadProcessId(Windowhld,nil); AttachThreadInput(GetCurrentThreadId,threadld,true); Focushld:=getfocus; getcursorpos(p); //查鼠标坐标 Focushld:=WindowFromPoint(p); //返回句柄 AttachThreadInput(GetCurrentThreadId,threadld,false); if (focushld=0) or (focushld=Self.Memo1.Handle) or (focushld=Self.Edit1.Handle) or (focushld=Self.Edit2.Handle) or (focushld=SpinEdit1.Handle) then begin Exit; end; i := 1; while i <= Length(sSend) do begin ch := byte(sSend[i]); if Windows.IsDBCSLeadByte(ch) then begin Inc(i); SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend[i]), ch), 0); end else begin SendMessage(focushld, WM_IME_CHAR, word(ch), 0); end; Inc(i); end; SendMessage(focushld, WM_IME_CHAR, word(13), 0);end;//定时器定时发送字符procedure TForm1.Timer1Timer(Sender: TObject);begin SendKeys('ABCD1234大话西游');end;--------------第二种方法------------这种方法用拷贝-粘贴的方式,在记事本下正常,但在WORD下毫无反应!------------------------------------procedure TGoodDictForm.SendKey();var i:integer; focushld,windowhld:hwnd; threadld:dword; ch: byte;begin windowhld:=GetForegroundWindow; threadld:=GetWindowThreadProcessId(Windowhld,nil); AttachThreadInput(GetCurrentThreadId,threadld,true); getcursorpos(p); //查鼠标坐标 Focushld:=WindowFromPoint(p); //返回句柄 AttachThreadInput(GetCurrentThreadId,threadld,false); if (focushld=0) or (focushld=Self.Memo1.Handle) then begin Exit; end; SendMessage(focushld, WM_Paste, 0, 0);end;//定时器定时发送字符procedure TForm1.Timer1Timer(Sender: TObject);begin Edit1.SelectAll; Edit1.CopyToClipboard; SendKeys();end; To kingkong要正確送出中文字符一定要依照微軟的IME機制, 單純用SendMessage是不能夠的. 你可以把要送出的字符放在剪貼板中, 使用keybd_event這個API送出 Ctrl 與 V 兩鍵的組合. 就能夠把中英文字串放到Word等軟件中, keybd_event(VK_CONTROL, 0, 0, 0);keybd_event(Ord('v'), 0, 0, 0);keybd_event(Ord('v'), 0, KEYEVENTF_KEYUP, 0);keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);uses sendkey32{+ = Shift^ = Control% = Alt}SendKeys('^X',true); 发送 Control+X消息 procedure TForm1.Button1Click(Sender: TObject);var KeyState: TKeyboardState;begin GetKeyboardState(KeyState); KeyState[VK_CONTROL] := not KeyState[VK_CONTROL]; // ctrl->down SetKeyboardState(KeyState); SendMessage(Form1.Handle, WM_KEYDOWN, WPARAM('A'), 0); GetKeyboardState(KeyState); KeyState[VK_CONTROL] := not KeyState[VK_CONTROL]; // ctrl->up SetKeyboardState(KeyState);end;procedure MyKeyDown(var msg: TWMKeyDown);message WM_KEYDOWN;procedure TForm1.MyKeyDown(var msg: TWMKeyDown);begin if GetKeyState(VK_CONTROL) < 0 then begin ShowMessage('Ctrl + ' + Chr(msg.CharCode)); // it's OK. end; inherited;end;ply try it. 谢谢大家,不过这几种方法我都试过,不行的我是控制其它程序用,发送 Ctrl+A, 全选SetKeyboardState(KeyState); 的方法没有作用。一楼 keybd_event 的方法需要切换焦点,不适用 hwnd := FindWindow('notepad', nil); SendMessage(hwnd, WM_COMMAND, 7, 0);>>>>>>>>>>>>>>>>不是给你这个了吗?有些程序是通过WM_COMMAND快捷键的 beyondtkl(大龙驹)的方法是可行的! to cnhgj(戏子) (一个人睡) hwnd := FindWindow('notepad', nil); SendMessage(hwnd, WM_COMMAND, 7, 0);这个好像只有nodepad中才行,是nodepad特有的? tmd,看见一字不动照抄别人回复的就来气 高手解答!!!! cxgrid columns中怎么没有这个valuetype属性 求年会抽奖软件 Delphi+MySQL系统的稳定性如何? DELPHI里DBGRID问题 杭州地区,本人欲购一辆二手自行车。 关于链表的问题 如何动态改变Windows右下角程序图标? 关于线程的使用 在On Create/On Show过程中操作窗体 分班问题,能解决,小弟希望能拜你为师(只有这么多分了,希望大家帮帮忙) SOCKET问题,怎么得到传送速度?
hwnd : Integer;
begin
hwnd := FindWindow('Notepad', nil);
SetForegroundWindow(hwnd);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
end;
hwnd : Integer;
begin
hwnd := FindWindow('Notepad', nil);
SetForegroundWindow(hwnd);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
end;
SendMessage(hwnd, WM_COMMAND, 7, 0);
你可以这样 先设定ctrl键的状态为按下状态 函数忘记了
然后SendMessage(hwnd, WM_KEYDOWN, 'a', 0);
这种方法在中文输入法打开的情况下中西文都正常,
但我不想用这种费事的办法.
------------------------------------
//模拟按键函数
procedure TForm1.SendKeys(sSend:string);
var
i:integer;
Sstr:string;
focushld,windowhld:hwnd;
threadld:dword;
ch: byte;
begin
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil);
AttachThreadInput(GetCurrentThreadId,threadld,true);
Focushld:=getfocus;
getcursorpos(p); //查鼠标坐标
Focushld:=WindowFromPoint(p); //返回句柄
AttachThreadInput(GetCurrentThreadId,threadld,false);
if (focushld=0) or
(focushld=Self.Memo1.Handle) or
(focushld=Self.Edit1.Handle) or
(focushld=Self.Edit2.Handle) or
(focushld=SpinEdit1.Handle) then
begin
Exit;
end;
i := 1;
while i <= Length(sSend) do
begin
ch := byte(sSend[i]);
if Windows.IsDBCSLeadByte(ch) then
begin
Inc(i);
SendMessage(focushld, WM_IME_CHAR, MakeWord(byte(sSend[i]), ch), 0);
end
else
begin
SendMessage(focushld, WM_IME_CHAR, word(ch), 0);
end;
Inc(i);
end;
SendMessage(focushld, WM_IME_CHAR, word(13), 0);
end;//定时器定时发送字符
procedure TForm1.Timer1Timer(Sender: TObject);
begin
SendKeys('ABCD1234大话西游');
end;--------------第二种方法------------
这种方法用拷贝-粘贴的方式,在记事本下正常,
但在WORD下毫无反应!
------------------------------------
procedure TGoodDictForm.SendKey();
var
i:integer;
focushld,windowhld:hwnd;
threadld:dword;
ch: byte;
begin
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil);
AttachThreadInput(GetCurrentThreadId,threadld,true);
getcursorpos(p); //查鼠标坐标
Focushld:=WindowFromPoint(p); //返回句柄
AttachThreadInput(GetCurrentThreadId,threadld,false);
if (focushld=0) or (focushld=Self.Memo1.Handle) then
begin
Exit;
end;
SendMessage(focushld, WM_Paste, 0, 0);
end;//定时器定时发送字符
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.SelectAll;
Edit1.CopyToClipboard;
SendKeys();
end; To kingkong
要正確送出中文字符一定要依照微軟的IME機制, 單純用SendMessage
是不能夠的. 你可以把要送出的字符放在剪貼板中, 使用keybd_event
這個API送出 Ctrl 與 V 兩鍵的組合. 就能夠把中英文字串放到Word
等軟件中,
keybd_event(VK_CONTROL, 0, 0, 0);
keybd_event(Ord('v'), 0, 0, 0);
keybd_event(Ord('v'), 0, KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);uses sendkey32
{+ = Shift
^ = Control
% = Alt}
SendKeys('^X',true);
发送 Control+X消息
var
KeyState: TKeyboardState;
begin
GetKeyboardState(KeyState);
KeyState[VK_CONTROL] := not KeyState[VK_CONTROL]; // ctrl->down
SetKeyboardState(KeyState);
SendMessage(Form1.Handle, WM_KEYDOWN, WPARAM('A'), 0);
GetKeyboardState(KeyState);
KeyState[VK_CONTROL] := not KeyState[VK_CONTROL]; // ctrl->up
SetKeyboardState(KeyState);
end;procedure MyKeyDown(var msg: TWMKeyDown);message WM_KEYDOWN;procedure TForm1.MyKeyDown(var msg: TWMKeyDown);
begin
if GetKeyState(VK_CONTROL) < 0 then
begin
ShowMessage('Ctrl + ' + Chr(msg.CharCode)); // it's OK.
end;
inherited;
end;ply try it.
我是控制其它程序用,发送 Ctrl+A, 全选SetKeyboardState(KeyState); 的方法没有作用。
一楼 keybd_event 的方法需要切换焦点,不适用
SendMessage(hwnd, WM_COMMAND, 7, 0);>>>>>>>>>>>>>>>>
不是给你这个了吗?有些程序是通过WM_COMMAND快捷键的
SendMessage(hwnd, WM_COMMAND, 7, 0);这个好像只有nodepad中才行,是nodepad特有的?