虚拟键@?键注入c#

本文关键字:注入 虚拟 | 更新日期: 2023-09-27 17:53:20

我正试图将键注入程序。我已经设法注入密钥,但我找不到@符号的虚拟密钥代码。我发现这个网站非常有用,但仍然找不到它。Keys.Send ();不是一个选项,因为我不希望窗口被选中,我希望能够在后台完成所有操作。

这是我到目前为止的代码:

        const UInt32 WM_KEYDOWN = 0x0100;
    int VK_A = 0x41;
    [DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, int wParam, int lParam);
    private void button1_Click(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcessesByName("Notepad");
        foreach (Process proc in processes)
        {
            PostMessage(proc.MainWindowHandle, WM_KEYDOWN, VK_A, 0);
        }
    }

这将发送A键到记事本。

虚拟键@?键注入c#

Windows为用户可以按下的每个键定义了特殊的常量,称为虚拟键代码。你的键盘上没有@键,而是用Shift+2(至少在我的键盘上)来做。

我认为,虽然你不能模拟Shift+2使用PostMessage。

见http://blogs.msdn.com/b/oldnewthing/archive/2005/05/30/423202.aspx .

@本身没有对应的键。您可以发送相应的键+修饰键状态,即美式键盘上的Shift+2。
但在其他键盘布局上,键是不同的。例如,在德语布局中,它是AltGr+ q

或者你可以直接发送WM_CHAR。这将适用于大多数应用程序,但有些(通常是游戏)不接受。

我会先尝试WM_CHAR,只有当这不起作用时才切换到WM_KEYDOWN。

@本身并不是一个键,而是一个'替代'字符,这意味着它只能在按下修改键(shift)时应用;因此,您可能需要组合两个值:

const int VK_OEM7 = 0xDE; // (" ') - this can be 'any' key, apparently
const int VK_SHIFT = 0xA0; // (left shift)
var keycode = VK_OEM7 | VK_SHIFT;

另一种可能性是,您可能需要在一系列呼叫中按下每个键。

无论哪种方式,您都需要不止一个键代码。


虽然我相信你必须采取我上面提到的第二种方法(组合值不太可能工作),我已经成为一个有点担心,你实际上是如何设法将字符发布到notepad在第一个地方,看到你正在使用MainWindowHandle而不是编辑器处理-以防万一你遇到任何尚未注意到的麻烦,下面的代码抓取记事本文本区域和允许你"发布"到它:

[DllImport("user32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
var editorHandle = FindWindowEx(proc.MainWindowHandle, new IntPtr(0), "Edit", null);

这是另一种解决方案-查找在外部应用程序中使用的键盘,并将字符映射到适当的键(如果可用)

我没有方便的c#定义
HWND handle; // the handle of the window you wish to type to 
DWORD idThread = GetWindowThreadProcessId(handle, NULL); 
// may also want to work in the same input queue - allows forground and focus to work
// AttachThreadInput(GetCurrentThreadId(), idThread,TRUE); 
HKL hklRemote = GetKeyboardLayout(idThread); 
SHORT VkCode = VkKeyScanEx(key, hklRemote );

同样,如果你想发送几个键(或鼠标点击)而不被用户打断,那么SendInput可能是一个更好的选择。