标签: sendinput

SendInput 在 UAC 提示时失败

我们正在编写一个仅运行的远程桌面应用程序,它使用 SendInput 进行键盘(和鼠标)交互。但是它无法与 UAC 提示交互。

我们的应用程序为此需要什么权限/权利?

背景信息:该应用程序是由复制 winlogon.exe 的访问令牌的另一个进程生成的。这使得可以在具有系统完整性级别的 SYSTEM 帐户下运行,附加到物理控制台会话,并具有与 winlogon.exe 相同的 SE 权限(https://learn.microsoft.com/en-us/windows/desktop/secauthz/特权常量),尽管并非所有这些都已启用。

struct MY_TOKEN_PRIVILEGES {
  DWORD PrivilegeCount;
  LUID_AND_ATTRIBUTES Privileges[2];
};

int RunUnderWinLogon(LPCWSTR executableWithSendInput)
{
  DWORD physicalConsoleSessionId = WTSGetActiveConsoleSessionId();

  auto winlogonPid = GetWinLogonPid(); // external function

  if (!winlogonPid)
  {
    std::cout << "ERROR getting winlogon pid" << std::endl;
    return 0;
  }

  HANDLE hWinlogonToken, hProcess;
  hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, winlogonPid);

  if (!::OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY
    | TOKEN_DUPLICATE | TOKEN_ASSIGN_PRIMARY | TOKEN_ADJUST_SESSIONID
    | TOKEN_READ | TOKEN_WRITE, &hWinlogonToken))
  { …
Run Code Online (Sandbox Code Playgroud)

winapi uac windows-security uipi sendinput

4
推荐指数
1
解决办法
1234
查看次数

如何在Delphi中使用SendInput?

Mouse_Event在Delphi 2009 中使用了这个函数,但是Delphi的文档说这个函数已被取代并SendInput代替使用.

Delphi SendInput文档定义了语法和参数,但没有示例,也不清楚如何使用该函数.我在网上浏览过,找不到任何好的Delphi示例.

具体来说,我试图模拟左鼠标然后向上.目前我这样做Mouse_Event如下:

    Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    Mouse_Event(MOUSEEVENTF_ABSOLUTE or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

我该如何使用SendInput


跟进:

我最终留下了我的代码,就像@David建议的那样.

但我给了@ opc0de答案,因为他确实回答了我的问题.但是,我不能保证它是正确的,因为我从来没有尝试过.

delphi mouseevent sendinput

3
推荐指数
1
解决办法
5437
查看次数

通过INPUT结构发送Ctrl Alt Del不起作用?

如何模拟这个ctrl alt del以便它可以工作?

我的代码如下:

输入输入;/*生成"按键"*/

Input.type  = INPUT_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF_SCANCODE; 
Input.ki.wScan=29;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF_SCANCODE; 
Input.ki.wScan=56;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_SCANCODE; 
Input.ki.wScan=83;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP; 
Input.ki.wScan=29;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT_KEYBOARD;
Input.ki.dwFlags  = KEYEVENTF_SCANCODE  | KEYEVENTF_KEYUP; 
Input.ki.wScan=56;
Input.ki.dwExtraInfo=0;
Input.ki.wVk=0;
Input.ki.time=0;
SendInput(1, &Input, sizeof(Input));


Input.type  = INPUT_KEYBOARD;
Input.ki.dwFlags …
Run Code Online (Sandbox Code Playgroud)

windows visual-c++ sendinput

3
推荐指数
1
解决办法
2004
查看次数

模拟点击进入隐藏窗口

我有一个 C# 问题,

我能够模拟对当前窗口的点击,但如果窗口被最小化或隐藏,我想这样做。

有任何想法吗?

c# hidden click simulate sendinput

3
推荐指数
1
解决办法
8546
查看次数

如何使用 C#/pinvoke 将输入发送到 WinSta0\Winlogon 桌面

我正在用 C# 为一套技术支持工具编写远程控制应用程序。一切工作正常,除了我无法使用 SendInput 到 Winlogon 桌面。我成功检测到从默认到 Winlogon 的更改,并且我能够切换到它并捕获屏幕截图。它只是不接受 SendInput 函数。我知道这是可能的,因为 TeamViewer 这样做了,而且他们的清单中没有 uiAccess=true 。他们似乎正在使用与我相同的流程。

简而言之,这就是我正在做的事情:安装服务。服务监听连接请求。服务使用 CreateProcessAsUser 和来自 winlogon.exe 的重复访问令牌在用户会话中启动新进程。查看器连接到新进程。

任何人都可以确定缺少什么来让新进程访问 SendInput 到 winlogon 吗?这是我用来从服务启动新进程的代码。接下来是我用来检测 Winlogon 桌面更改并切换到它的代码。

public static bool OpenProcessAsSystem(string applicationName, out PROCESS_INFORMATION procInfo)
{
    try
    {

        uint winlogonPid = 0;
        IntPtr hUserTokenDup = IntPtr.Zero, hPToken = IntPtr.Zero, hProcess = IntPtr.Zero;
        procInfo = new PROCESS_INFORMATION();

        // Obtain session ID for active session.
        uint dwSessionId = Kernel32.WTSGetActiveConsoleSessionId();

        // Check for RDP session.  If active, use that session ID instead.
        var …
Run Code Online (Sandbox Code Playgroud)

c# winlogon sendinput teamviewer

3
推荐指数
1
解决办法
3629
查看次数

如何将字符串发送到其他应用程序,包括Microsoft Word

我试图完成这个但是没有取得好成绩.我使用GetForegroundWindow(),AttachThreadInput(uint,uint,bool)和GetFocus()函数将字符串发送到另一个窗口.它适用于记事本,写字板和其他应用程序,但不适用于Microsoft Word.

int foregroundWindowHandle = GetForegroundWindow();
uint remoteThreadId = GetWindowThreadProcessId(foregroundWindowHandle, 0);
uint currentThreadId = GetCurrentThreadId();
bool b = AttachThreadInput(remoteThreadId, currentThreadId, true);
int focused = GetFocus();
int d = System.Runtime.InteropServices.Marshal.GetLastWin32Error();
b = AttachThreadInput(remoteThreadId, currentThreadId, false);
SendMessage(focused , WM_GETTEXT, builder.Capacity, builder);
clip = builder.ToString();

//Text operations...

SendMessage(focused, WM_SETTEXT, 0, builder);
Run Code Online (Sandbox Code Playgroud)

这是我的代码,但它不适用于Word.我知道Word使用自定义控件,但我认为应该有另一种方法来处理它.

例如:Windows语音识别将文本发送到每个具有焦点的应用程序,即使它是Word.我不认为他们手动输入.

我想使用SendInputs函数,但我不知道如何做到这一点.

c# windows winapi sendmessage sendinput

2
推荐指数
1
解决办法
8838
查看次数

SendInput到后台窗口

我想将从Android客户端收到的鼠标和键盘输入发送到在Windows上运行的游戏. SendInput适用于我迄今为止工作过的几乎所有游戏.但是为了SendInput工作,游戏必须是前景窗口.

要解决我用PostMessage(hwnd,...)hwnd处理游戏窗口的问题.但是如果游戏使用DirectInput,这不起作用.这是通过挂钩解决的GetDeviceState.现在我开始工作的另一个游戏是使用WM_INPUT或原始输入,我必须创建原始输入以使其工作.

根据这篇MSDN文章

DirectInput是一组API调用,用于抽象系统上的输入设备.在内部,DirectInput创建第二个线程来读取WM_INPUT数据,并且使用DirectInput API将比直接读取WM_INPUT增加更多的开销.

directInput使用WM_INPUT工作.

SendInput函数插入在输入结构的事件串联到键盘或鼠标输入流.这些事件不会插入用户(使用键盘或鼠标)插入的其他键盘或鼠标输入事件,也不会调用keybd_event,mouse_event或其他SendInput调用.

所以SendInput也提供抽象.

我想要的是即使它的窗口没有聚焦,也可以独立地将输入发送到应用程序.这样我就可以一次向多个游戏发送输入.有没有办法使用一个更高级别的API调用,如SendInput来实现这一目标?这可以用SendInput完成吗?那有没有C/C++库?

c++ winapi sdl directinput sendinput

2
推荐指数
1
解决办法
2652
查看次数

在 C++ 上使用 SendInput 不显示下划线

这是我在stackoverflow上发布的第一个问题。我一直在寻找SendInputC++,以便将我的程序“输入”到另一个程序中。我决定首先在终端中“输入”几个带有下划线的单词。我发现输入大写和小写字母以及句点没有问题。但是到了下划线后,输入数字 id 95作为下划线字母,下划线没有显示,完全就像那个字母没有被按下一样。这是我从 cplusplus.com 获得的代码,我基于它,它功能齐全:

#include <iostream>
#include <windows.h>
using namespace std;

/* HWND = "Window Handle" */
HWND GameWindow = FindWindow(0, "Command Prompt");

/* This is a function to simplify usage of sending keys */
void GenerateKey(int vk, BOOL bExtended) {

    KEYBDINPUT  kb = {0};
    INPUT       Input = {0};

    /* Generate a "key down" */
    if (bExtended) { kb.dwFlags  = KEYEVENTF_EXTENDEDKEY; }
    kb.wVk  = vk;
    Input.type  = INPUT_KEYBOARD;
    Input.ki  = kb;
    SendInput(1, &Input, sizeof(Input));

    /* Generate …
Run Code Online (Sandbox Code Playgroud)

c++ winapi sendinput

2
推荐指数
1
解决办法
298
查看次数

无法使用SendInput(Edit1.Text)复制俄语(西里尔语或Unicode)符号

procedure SendText(ds:string);
var
  TI: TInput;
  KI: TKeybdInput;
  i: integer;
begin
  TI.Itype := INPUT_KEYBOARD;
  for i := 1 to Length(ds) do
  begin
    KI.wVk := Ord(UpCase(ds[i]));
    KI.dwFlags := 0;
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
    KI.dwFlags := KEYEVENTF_KEYUP;
    TI.ki := KI;
    SendInput(1, TI, SizeOf(TI));
  end;
end;
Run Code Online (Sandbox Code Playgroud)

如何添加Unicode?任何建议如何使用复制俄罗斯(Cyrilic)符号SendInput(Edit1.Text);

delphi unicode delphi-7 character-encoding sendinput

1
推荐指数
1
解决办法
844
查看次数

使用Java JNA和SendInput()发送键盘输入

我有兴趣在这种情况下使用Windows 7与Java进行操作系统交互,并希望在较低级别上模拟一些按键(例如CTRL + V)。

首先,我知道Java是一个错误的选择,但是它是我最好的编程语言,我知道它是可能的。另外,我知道awt.robot存在,但对于我来说它的级别太高了(我真的需要驱动程序级别)。

我问这个问题是因为我真的很想了解jna,并且在观看了20个代码示例后仍然遇到问题。

sendInput()完成的击键代码示例将对我有所帮助。

非常感谢。

问候语Ext1nct1on

java keystroke jna sendinput

1
推荐指数
1
解决办法
3263
查看次数

SendInput 参数错误

我想改进我的SendInput()功能,但遇到了错误。

错误_无效_参数

87 (0x57)

The parameter is incorrect.
Run Code Online (Sandbox Code Playgroud)

https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx

我有点困惑哪个参数不应该正确。

如果我忘记了什么,请随时询问。

INPUT in[6] = {0};

//Press Enter Key
in[0].type = INPUT_KEYBOARD;
in[0].ki.wScan = 0;
in[0].ki.dwFlags = 0;
in[0].ki.time = 0;
in[0].ki.dwExtraInfo = 0;
in[0].ki.wVk = VK_RETURN;

//release enter key
in[1] = in[0];
in[1].ki.dwFlags = KEYEVENTF_KEYUP;

//Hold Shift key and press key 7
in[2].type = INPUT_KEYBOARD;
in[2].ki.wScan = 0;
in[2].ki.dwFlags = 0;
in[2].ki.time = 0;
in[2].ki.dwExtraInfo = 0;
in[2].ki.wVk = VK_SHIFT;

in[3].type = INPUT_KEYBOARD;
in[3].ki.wScan = 0;
in[3].ki.dwFlags = …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi sendinput

1
推荐指数
1
解决办法
567
查看次数

将单元素数组传递给SendInput是一个错误吗?

给出以下代码

void foo() {
    INPUT input{};
    input.type = INPUT_MOUSE;
    input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    SendInput(1, &input, sizeof(input));
    input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
    SendInput(1, &input, sizeof(input));
};
Run Code Online (Sandbox Code Playgroud)

在连续调用中将单元素数组传递给SendInput是一个错误吗?文档似乎完全支持这一点.

winapi sendinput

0
推荐指数
1
解决办法
190
查看次数

使用SendInput API模拟鼠标单击时是否需要引入延迟?

我需要能够在另一个进程中模拟鼠标单击控件.我想出了以下方法:

BOOL SimulateMouseClick(POINT* pPntAt)
{
    //Simulate mouse left-click
    //'pPntAt' = mouse coordinate on the screen
    //RETURN:
    //      = TRUE if success
    BOOL bRes = FALSE;

    if(pPntAt)
    {
        //Get current mouse position
        POINT pntMouse = {0};
        BOOL bGotPntMouse = ::GetCursorPos(&pntMouse);

        //Move mouse to a new position
        ::SetCursorPos(pPntAt->x, pPntAt->y);

        //Send mouse click simulation
        INPUT inp = {0};
        inp.type = INPUT_MOUSE;
        inp.mi.dx = pPntAt->x;
        inp.mi.dy = pPntAt->y;
        inp.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        if(SendInput(1, &inp, sizeof(inp)) == 1)
        {
            //Do I need to wait here?
            Sleep(100); …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi sendinput

-1
推荐指数
1
解决办法
741
查看次数