Sending Keyboard Macro Commands to Game Windows

后端 未结 5 1021
离开以前
离开以前 2021-02-06 18:25

I wanna do a macro program for a game. But there is a problem with sending keys to only game application (game window). I am using keybd_event API for sending keys

相关标签:
5条回答
  • 2021-02-06 19:07

    If you want to communicate with a game, you typically will have to deal with DirectInput, not the normal keyboard API's.

    0 讨论(0)
  • 2021-02-06 19:08

    Are you retrieving the handle of the window all the time, or are you remembering it?

    If you use the FindWindow() API, you can simply store the Handle and use the SendMessage API to send key/mouse events manually.

    0 讨论(0)
  • 2021-02-06 19:10

    i fixed my problem. in this field ;

    PostMessage(hWnd, WM_KEYDOWN, key, {have to give lParam of the key});

    otherwise it does not work.And we can control of ChildWindow Class with Spy++ tool of Microsoft.

    Thanks everyone for helping.

    0 讨论(0)
  • 2021-02-06 19:18
    class SendKeySample
    {
        private static Int32 WM_KEYDOWN = 0x100;
        private static Int32 WM_KEYUP = 0x101;
    
        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, int lParam);
    
        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
    
        public static IntPtr FindWindow(string windowName)
        {
            foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
            {
                if (p.MainWindowHandle != IntPtr.Zero && p.MainWindowTitle.ToLower() == windowName.ToLower())
                    return p.MainWindowHandle;
            }
    
            return IntPtr.Zero;
        }
    
        public static IntPtr FindWindow(IntPtr parent, string childClassName)
        {
            return FindWindowEx(parent, IntPtr.Zero, childClassName, string.Empty);
        }
    
        public static void SendKey(IntPtr hWnd, System.Windows.Forms.Keys key)
        {
            PostMessage(hWnd, WM_KEYDOWN, key, 0);
    
        }
    }
    

    Calling Code

            var hWnd = SendKeySample.FindWindow("Untitled - Notepad");
            var editBox = SendKeySample.FindWindow(hWnd, "edit");
    
            SendKeySample.SendKey(editBox, Keys.A);
    
    0 讨论(0)
  • 2021-02-06 19:22

    FindWindow API:
    http://www.pinvoke.net/default.aspx/user32.FindWindowEx

    SendMessage API:
    http://www.pinvoke.net/default.aspx/user32/SendMessage.html

    VB

    Private Const WM_KEYDOWN As Integer = &H100
    Private Const WM_KEYUP As Integer = &H101
    

    C#

    private static int WM_KEYDOWN = 0x100
    private static int WM_KEYUP = 0x101
    
    0 讨论(0)
提交回复
热议问题