使用User32.dll将输入发送到其他窗口

本文关键字:其他 窗口 输入 User32 dll 使用 | 更新日期: 2023-09-27 18:25:47

我正试图将关键命令从我的程序发送到另一个程序,但它目前不起作用。这与完全相同的实现在不同的程序中完全正常工作无关。

另一个窗口的激活工作正常,但没有扫描码发送到它。

非常感谢您的帮助。

这是我的代码

[DllImport( "User32.dll" )]
private static extern int SetForegroundWindow( IntPtr point );
[DllImport( "User32.dll" )]
private static extern bool ShowWindow( IntPtr hWnd, int nCmdShow );
public void SendKeyBind( ) {
        if ( Main.Device == DeviceType.Keyboard ) {
            SetForegroundWindow( EliteDangerousPointer );
            ShowWindow( EliteDangerousPointer, 5 );
            List<uint> modifiersSC = Modifiers.ConvertAll( x => ConvertKeyToSC( x.Key ) );
            uint mainSC = ConvertKeyToSC( Main.Key );
            foreach ( uint msc in modifiersSC )
                SendKey( msc, KeyFlag.KeyDown | KeyFlag.Scancode );
            SendKey( mainSC, KeyFlag.KeyDown | KeyFlag.Scancode );
            System.Threading.Thread.Sleep( 100 );
            SendKey( mainSC, KeyFlag.KeyUp | KeyFlag.Scancode );
            foreach ( uint msc in modifiersSC )
                SendKey( msc, KeyFlag.KeyUp | KeyFlag.Scancode );
        }
    }
[DllImport( "User32.dll" )]
private static extern uint MapVirtualKey( uint uCode, uint uMapType );
private uint ConvertKeyToSC( Keys key ) {
    uint keyCode = (uint)key;
    uint scanCode = MapVirtualKey(keyCode, 0);
    return scanCode;
}

它将此类与using static一起实际发送扫描码

public static class VirtualKeyboard {
    [StructLayout( LayoutKind.Sequential )]
    internal struct KEYBOARDINPUT {
        public uint type;
        public ushort vk;
        public ushort scanCode;
        public uint flags;
        public uint time;
        public uint extrainfo;
        public uint padding1;
        public uint padding2;
    }
    [StructLayout( LayoutKind.Sequential )]
    internal struct MOUSEINPUT {
        public uint dx;
        public uint dy;
        public uint mouseData;
        public uint dwFlags;
        public uint time;
        public IntPtr dwExtraInfo;
    }
    [StructLayout( LayoutKind.Sequential )]
    internal struct HARDWAREINPUT {
        public int uMsg;
        public short wParamL;
        public short wParamH;
    }
    [StructLayout( LayoutKind.Explicit )]
    internal struct INPUT {
        [FieldOffset(0)]
        public int type;
        [FieldOffset(4)]
        public MOUSEINPUT mi;
        [FieldOffset(4)]
        public KEYBOARDINPUT ki;
        [FieldOffset(4)]
        public HARDWAREINPUT hi;
    }
    [DllImport( "User32.dll" )]
    private static extern uint SendInput( uint numberOfInputs, ref INPUT input,
    int structSize );
    [Flags]
    public enum KeyFlag {
        KeyDown = 0x0000,
        KeyUp = 0x0002,
        Scancode = 0x0008
    }
    public static void SendKey( uint keyCode, KeyFlag keyFlag ) {
        INPUT InputData = new INPUT();
        InputData.type = 1;
        InputData.ki.scanCode = ( ushort ) keyCode;
        InputData.ki.flags = ( uint ) keyFlag;
        Console.WriteLine( InputData.ki.scanCode );
        Console.WriteLine( keyCode );
        SendInput( ( uint ) 1, ref InputData, ( int ) Marshal.SizeOf( typeof( INPUT ) ) );
    }
}

使用User32.dll将输入发送到其他窗口

当Windows信使成为一种东西时,我制作了一个实用程序来自动打开并为我键入我的电子邮件和密码,也许这种方法对你有用:

using System.Runtime.InteropServices;
using System.Security.Cryptography;
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

System.Diagnostics.Process.Start("C:''Program Files (x86)''Windows Live''Messenger''msnmsgr.exe");
IntPtr msnHandle = FindWindow("SharedSigninDialogClass", "Windows Live Messenger");
while (msnHandle == IntPtr.Zero)
{
    System.Threading.Thread.Sleep(100);
    msnHandle = FindWindow("SharedSigninDialogClass", "Windows Live Messenger");
}
SetForegroundWindow(msnHandle);
SendKeys.SendWait("my_awesomeEmail@hotmail.com");
SendKeys.SendWait("{TAB}");
SendKeys.SendWait("myawesomepassword");
SendKeys.SendWait("{ENTER}");