Delphi WinAPI SendInput

Delphi WinAPI SendInput - 合成击键、鼠标移动和按钮单击。

SendInput 函数,合成击键、鼠标移动和按钮单击。

原型:

UINT SendInput(
  UINT    cInputs, //pInputs数组中的结构数。
  LPINPUT pInputs, //一组输入结构。每个结构表示要插入键盘或鼠标输入流的事件。
  int     cbSize  //输入结构的大小,以字节为单位。如果cbSize不是输入结构的大小,则函数失败。
);  

Delphi

function SendInput(cInputs: UINT; var pInputs: TInput; cbSize: Integer): UINT; stdcall;

参数:

  pInputs //一组输入结构。每个结构表示要插入键盘或鼠标输入流的事件。关于结构定义,请参考:  

 

返回值(UINT):

  • 函数返回成功插入键盘或鼠标输入流的事件数。如果函数返回零,则输入已经被另一个线程阻塞。要获取扩展错误信息,请调用GetLastError。
  • 此函数在被UIPI阻止时失败。请注意,GetLastError和返回值都不会指示失败是由UIPI阻塞引起的。

其他事项:

  • 此函数受UIPI约束。应用程序只允许将输入注入到具有相同或更低完整性级别的应用程序中。
  • SendInput函数将输入结构中的事件串行插入键盘或鼠标输入流。这些事件不会与用户(使用键盘或鼠标)或通过调用keybd_event、mouse_event或其他调用SendInput插入的其他键盘或鼠标输入事件混杂在一起。
  • 此功能不会重置键盘的当前状态。调用函数时已按下的任何键都可能干扰此函数生成的事件。要避免此问题,请使用GetAsyncKeyState函数检查键盘的状态,并根据需要进行更正。
  • 因为触摸键盘使用winnls.h中定义的代理宏向系统发送输入,所以键盘事件挂钩上的侦听器必须解码来自触摸键盘的输入。有关详细信息,请参见代理项和补充字符。
  • 可访问性应用程序可以使用SendInput注入与shell处理的应用程序启动快捷键相对应的击键。此功能不能保证适用于其他类型的应用程序。

Delphi 示例:

示例1(Win+d):

procedure KeyPressWinD;
var
    Inputs:TInput;
begin
    //WIN
    Inputs.Itype:=INPUT_KEYBOARD;
    with Inputs.ki do
    begin
        wVk:=VK_LWIN;
        wScan:=0;
        dwFlags:=0;
        time:=GetTickCount;
        dwExtraInfo:=GetMessageExtraInfo;
    end;
    SendInput(1,Inputs,SizeOf(TInput));
    //D
    Inputs.Itype:=INPUT_KEYBOARD;
    with Inputs.ki do
    begin
        wVk:=68;
        wScan:=0;
        dwFlags:=0;
        time:=GetTickCount;
        dwExtraInfo:=GetMessageExtraInfo;
    end;
    SendInput(1,Inputs,SizeOf(TInput));

    //释放
    Inputs.Itype:=INPUT_KEYBOARD;
    with Inputs.ki do
    begin
        wVk:=68;
        wScan:=0;
        dwFlags:=KEYEVENTF_KEYUP;
        time:=GetTickCount;
        dwExtraInfo:=GetMessageExtraInfo;
    end;
    SendInput(1,Inputs,SizeOf(TInput));

    Inputs.Itype:=INPUT_KEYBOARD;
    with Inputs.ki do
    begin
        wVk:=VK_LWIN;
        wScan:=0;
        dwFlags:=KEYEVENTF_KEYUP;
        time:=GetTickCount;
        dwExtraInfo:=GetMessageExtraInfo;
    end;
    SendInput(1,Inputs,SizeOf(TInput));
end;

示例2(左键点击):

procedure MouseClick;
var
    Inputs : array [0..1] of TInput;
begin
    Inputs[0].Itype:=INPUT_MOUSE;
    with Inputs[0].mi do
    begin
        dx:=0;
        dy:=0;
        mouseData:=0;
        dwFlags:=MOUSEEVENTF_LEFTDOWN;
        time:=GetTickCount;
        dwExtraInfo:=GetMessageExtraInfo;
    end;
    Inputs[1].Itype:=INPUT_MOUSE;
    with Inputs[1].mi do
    begin
        dx:=0;
        dy:=0;
        mouseData:=0;
        dwFlags:=MOUSEEVENTF_LEFTUP;
        time:=GetTickCount;
        dwExtraInfo:=GetMessageExtraInfo;
    end;
    SendInput(2,Inputs[0],SizeOf(TInput));
end;

  

  

创建时间:2021.06.28  更新时间:

博客园 滔Roy https://www.cnblogs.com/guorongtao 希望内容对你所有帮助,谢谢!
原文地址:https://www.cnblogs.com/guorongtao/p/14944442.html