delphi dll中模拟按键输入

hdc733 2018-08-22 11:31:14
下面这段代码在程序里运行是通过的。但我想把这段代码转移到DLL动态链接库中去,但不知如何实现。请各位高手予以指点。
procedure KeybdEnten(G:String); //模拟键盘输入过程
begin
With form1 Do
begin
If G='0' Then
Begin
keybd_event($60,0,0,0);
keybd_event($60,0,KEYEVENTF_KEYUP,0);
End;
If G='1' Then
Begin
keybd_event($61,0,0,0);
keybd_event($61,0,KEYEVENTF_KEYUP,0);
End;
If G='2' Then
Begin
keybd_event($62,0,0,0);
keybd_event($62,0,KEYEVENTF_KEYUP,0);
End;
If G='3' Then
Begin
keybd_event($63,0,0,0);
keybd_event($63,0,KEYEVENTF_KEYUP,0);
End;
If G='4' Then
Begin
keybd_event($64,0,0,0);
keybd_event($64,0,KEYEVENTF_KEYUP,0);
End;
If G='5' Then
Begin
keybd_event($65,0,0,0);
keybd_event($65,0,KEYEVENTF_KEYUP,0);
End;
If G='6' Then
Begin
keybd_event($66,0,0,0);
keybd_event($66,0,KEYEVENTF_KEYUP,0);
End;
If G='7' Then
Begin
keybd_event($67,0,0,0);
keybd_event($67,0,KEYEVENTF_KEYUP,0);
End;
If G='8' Then
Begin
keybd_event($68,0,0,0);
keybd_event($68,0,KEYEVENTF_KEYUP,0);
End;
If G='9' Then
Begin
keybd_event($69,0,0,0);
keybd_event($69,0,KEYEVENTF_KEYUP,0);
End;
If G='13' Then
Begin
keybd_event(vk_return,0,0,0);
keybd_event(vk_return,0,KEYEVENTF_KEYUP,0); //模拟键盘输入“回车”
End;
Sleep(30);
End;
end;
...全文
233 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hdc733 2018-08-23
  • 打赏
  • 举报
回复
后面改过来了。但还是有问题。慢慢找吧。非常感谢。
  • 打赏
  • 举报
回复
你没有写导出啊,应该是基础语法不熟悉的问题:
library KeyEnt;
uses WinApi.Windows;

procedure KeydbEnt(G:string); stdcall;
begin
if G<>'' then
begin
If G='0' Then
Begin
keybd_event($60,0,0,0);
keybd_event($60,0,KEYEVENTF_KEYUP,0);
End;
Begin
keybd_event($60,0,0,0);
keybd_event($60,0,KEYEVENTF_KEYUP,0);
End;
Sleep(30);
end;
end;

exports
KeydbEnt;

end.
hdc733 2018-08-22
  • 打赏
  • 举报
回复
之前已经这样写了。但编译不通过。
library KeyEnt;

uses
System.SysUtils,
System.Classes;

{$R *.res}

function KeydbEnt(G:string):stdcall; ////模拟键盘输入过程
begin
if G<>'' then
begin
If G='0' Then
Begin
keybd_event($60,0,0,0);
keybd_event($60,0,KEYEVENTF_KEYUP,0);
End;
//省略
If G='13' Then
Begin
keybd_event(vk_return,0,0,0);
keybd_event(vk_return,0,KEYEVENTF_KEYUP,0); //模拟键盘输入“回车”
End;
Sleep(30);
end;
end;

begin
end.

错误显示:E2003 Undedared identifier;'stdcall'
E2003 Undedared identifier;'keybd_event'
  • 打赏
  • 举报
回复
With form1 Do // 删掉
begin // 删掉
// 这之间的保留
End; // 删掉
end;
hdc733 2018-08-22
  • 打赏
  • 举报
回复
library KeyEnt;

uses
System.SysUtils,
System.Classes;

{$R *.res}

procedure KeydbEnt(G:string):stdcall; ////模拟键盘输入过程
begin
if G<>'' then
begin
If G='0' Then
Begin
keybd_event($60,0,0,0);
keybd_event($60,0,KEYEVENTF_KEYUP,0);
End;
Begin
keybd_event($60,0,0,0);
keybd_event($60,0,KEYEVENTF_KEYUP,0);
End;
Sleep(30);
end;
end;
begin
end.

在程序中声明
implementation
procedure KeydbEnt(G:string);external 'mnaj.dll';

并在过程调用
KeydbEnt(S);

运行显示“无法定位程序输入点KeydbEnt于动态链接库...”
  • 打赏
  • 举报
回复
其他代码的问题
hdc733 2018-08-22
  • 打赏
  • 举报
回复
编译是成功了。但调用就出错。总是显示程序关闭。还需要继续指导。
  • 打赏
  • 举报
回复
DLL中一样写procedure,function需要有返回值:
function KeydbEnt(G:string): integer; stdcall;
begin
// ...
Result := 0;
end;
hdc733 2018-08-22
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
本来是procedure,为什么改成function,function要有返回值。

因为每次都需要输入若干号码。我想把它转移到Dll库中,不同程序直接调用。
  • 打赏
  • 举报
回复
本来是procedure,为什么改成function,function要有返回值。
  • 打赏
  • 举报
回复
keybd_event需要uses WinApi.Windows;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧