gpt4 book ai didi

delphi - 模拟按键但仅针对特定窗口?

转载 作者:行者123 更新时间:2023-12-02 04:35:43 28 4
gpt4 key购买 nike

有很多关于如何使用 Windows API 来模拟按键的示例。一种选择类似于下面的代码。

但是我想要实现的目标是更进一步。下面的代码要求您要发送 key 的应用程序始终位于前台窗口。我正在尝试将按键发送到未聚焦的窗口,因此我可以在最小化此窗口的情况下自动执行任务/宏。

还有其他选择吗?

谢谢

procedure PostKeyEx32(key: Word; const shift: TShiftState;
specialkey: Boolean);
type
TShiftKeyInfo = record
shift: Byte ;
vkey: Byte ;
end;
ByteSet = set of 0..7 ;
const
shiftkeys: array [1..3] of TShiftKeyInfo =
((shift: Ord(ssCtrl) ; vkey: VK_CONTROL),
(shift: Ord(ssShift) ; vkey: VK_SHIFT),
(shift: Ord(ssAlt) ; vkey: VK_MENU)) ;
var
flag: DWORD;
bShift: ByteSet absolute shift;
j: Integer;
begin
for j := 1 to 3 do
begin
if shiftkeys[j].shift in bShift then
keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), 0, 0) ;
end;
if specialkey then
flag := KEYEVENTF_EXTENDEDKEY
else
flag := 0;

if key = 47 then
begin
keybd_event(VkKeyScan('/'), 1, 0, 0);
end
else
begin
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;
flag := flag or KEYEVENTF_KEYUP;
keybd_event(key, MapvirtualKey(key, 0), flag, 0) ;
end;

for j := 3 downto 1 do
begin
if shiftkeys[j].shift in bShift then
keybd_event(shiftkeys[j].vkey, MapVirtualKey(shiftkeys[j].vkey, 0), KEYEVENTF_KEYUP, 0) ;
end;
end;

最佳答案

这是一个通过特定窗口发送/处理 WM_KEYUP 消息的示例。但对于任何其他消息类型都是相同的(自定义消息类型也是如此,只是参数取决于其类型)目标窗口必须实现消息处理程序。

procedure onKeyPressed( var message_ : TWMKeyUp ); message WM_KEYUP;

要发送消息,您必须使用带有正确参数的sendMessage。第一个参数是窗口句柄,第二个参数是消息ID,第三个和第四个参数取决于消息ID定义的消息类型。

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
procedure onKeyPressed( var message_ : TWMKeyUp ); message WM_KEYUP;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if ( edit1.text <> '' ) then
sendMessage( handle, WM_KEYUP, cardinal( edit1.text[1] ), 0 );
end;

procedure TForm1.onKeyPressed( var message_ : TWMKeyUp );
var
c : char;
begin
c := char( message_.CharCode );
label1.caption := label1.caption + c;
end;

关于delphi - 模拟按键但仅针对特定窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52209838/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com