Winapi 如何在不必使用Windows API激活的情况下向窗口发送按键?

Winapi 如何在不必使用Windows API激活的情况下向窗口发送按键?,winapi,sendmessage,sendkeys,keystroke,Winapi,Sendmessage,Sendkeys,Keystroke,我已经制作了一个应用程序,可以向激活的窗口发送命令。我希望能够在进程运行时使用计算机,因为一旦我将焦点切换到另一个窗口,通过发送键发送的按键将转到我刚才切换到的窗口。 目前,我使用Windows API中的FindWindow、IsIconic和ShowWindow。我必须用FindWindow检查窗口是否存在,并将我的对象设置为该调用返回的特定窗口,然后用IsIconic检查它是否最小化,如果是,则调用ShowWindow,最后我必须调用Interaction.AppActivate将焦点设置

我已经制作了一个应用程序,可以向激活的窗口发送命令。我希望能够在进程运行时使用计算机,因为一旦我将焦点切换到另一个窗口,通过发送键发送的按键将转到我刚才切换到的窗口。


目前,我使用Windows API中的FindWindow、IsIconic和ShowWindow。我必须用FindWindow检查窗口是否存在,并将我的对象设置为该调用返回的特定窗口,然后用IsIconic检查它是否最小化,如果是,则调用ShowWindow,最后我必须调用Interaction.AppActivate将焦点设置为该窗口。所有这些都是在我发送按键之前完成的。似乎应该有一种方法可以只发送按键,而不必显示窗口并激活它。重要的是,当我的应用程序运行按键时,我无法在我的计算机上执行任何操作。

听起来像是在使用keybd_event()或SendInput(),这两种方法都会将按键发送到当前活动的窗口。要将击键指向特定窗口,无论widnow是否聚焦,都需要先找到它的HWND句柄,然后直接向它发送格式正确的WM_KEYUP/DOWN和WM_CHAR消息。

好吧,这肯定有点令人失望,但基本上,无法以100%的可靠性完成这项工作

Windows假定活动窗口是获取键盘输入的窗口。伪造键盘输入的正确方法是使用,您会注意到它只向活动窗口发送消息


这就是说,你可以,和消息(取决于WndProc接收它们)可能会逃脱惩罚。但请记住,在某些情况下,这是句号。

一旦您拥有windows HWND,您就可以直接将WM_KEYDOWN和WM_keydup消息发送到其消息队列。该窗口不必处于活动状态

但是,请理解这取决于目标应用程序如何处理键盘输入。有几种不同的处理方法

WM_KEYUP/WM_KEYDOWN是最常见的,一些应用程序只处理其中一个(通常是WM_KEYDOWN)

WM_CHAR也相当常见

有些程序使用GetAsyncKeyState、GetKeyState或GetKeyboardState。这是极不寻常的,但有效地防止了SendMessage()的按键注入。如果是这种情况,请返回键盘驱动程序直接处理的keybd_event()。当然,该窗口必须处于活动状态

#包括
#include <windows.h>
#include <iostream>
#include <string>


int main()
{
    LPCWSTR Target_window_Name = TEXT("Untitled - Notepad"); //<- Has to match window name
    HWND hWindowHandle = FindWindow(NULL, Target_window_Name);
    HWND EditClass = FindWindowEx(hWindowHandle, NULL, L"Edit", NULL);

    SendMessage(EditClass, WM_KEYDOWN, 0x5A, 0x002C0001);
    SendMessage(EditClass, WM_CHAR, 0x7A, 0x002C0001); //"z"
    SendMessage(EditClass, WM_KEYUP, 0x5A, 0xC02C0001);

    return(0);
}
#包括 #包括 int main() {
LPCWSTR目标\窗口\名称=文本(“无标题-记事本”)我正在使用Windows Vista。我还在C语言中使用Visual Studio 2008的.NET 3.5 SP1框架。有很好的理由,你不能直接把键盘输入到任何活动窗口。它们有点微妙,但是它们在那里。我在Windows上在C++上做过类似的事情。我捕获了HDC(设备上下文)。创建一个记事本实例,并使用SendMessage将其输入镜像到另一个(非活动)记事本中。如果有设备上下文,您甚至可以写入最小化的应用程序。@Annie这是一个旧线程,但您的答案似乎与我的需要非常相关。您是HDC(设备上下文)吗捕获比SendMessage更可靠?将模拟输入发送到最小化的窗口如果某些程序使用
GetAsyncKeyState
,是否有办法伪造键盘来发送模拟输入?可能是拦截系统调用,或者我不确定有什么人有关于
将中断
链接的实时链接?@MichalCiechan对您的问题,但这是链接: