我们正在编写一个仅运行的远程桌面应用程序,它使用 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) 我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答案,因为他确实回答了我的问题.但是,我不能保证它是正确的,因为我从来没有尝试过.
如何模拟这个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) 我有一个 C# 问题,
我能够模拟对当前窗口的点击,但如果窗口被最小化或隐藏,我想这样做。
有任何想法吗?
我正在用 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) 我试图完成这个但是没有取得好成绩.我使用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函数,但我不知道如何做到这一点.
我想将从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++库?
这是我在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) 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);
我有兴趣在这种情况下使用Windows 7与Java进行操作系统交互,并希望在较低级别上模拟一些按键(例如CTRL + V)。
首先,我知道Java是一个错误的选择,但是它是我最好的编程语言,我知道它是可能的。另外,我知道awt.robot存在,但对于我来说它的级别太高了(我真的需要驱动程序级别)。
我问这个问题是因为我真的很想了解jna,并且在观看了20个代码示例后仍然遇到问题。
sendInput()完成的击键代码示例将对我有所帮助。
非常感谢。
问候语Ext1nct1on
我想改进我的SendInput()功能,但遇到了错误。
错误_无效_参数
Run Code Online (Sandbox Code Playgroud)87 (0x57) The parameter is incorrect.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) 给出以下代码
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是一个错误吗?文档似乎完全支持这一点.
我需要能够在另一个进程中模拟鼠标单击控件.我想出了以下方法:
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) sendinput ×13
winapi ×7
c++ ×4
windows ×4
c# ×3
delphi ×2
click ×1
delphi-7 ×1
directinput ×1
hidden ×1
java ×1
jna ×1
keystroke ×1
mouseevent ×1
sdl ×1
sendmessage ×1
simulate ×1
teamviewer ×1
uac ×1
uipi ×1
unicode ×1
visual-c++ ×1
winlogon ×1