none
user32.dll PostMessage doesn't working RRS feed

  • Question

  • Hi all,

    I'm trying to use PostMessage function to simulate key press activity to many other process, but the PostMessage function seems doesn't work. Here are codes:

        class Program
        {
            private const int WH_KEYBOARD_LL = 13;
    
            private const int WM_KEYDOWN = 0x0100;
    
            private static LowLevelKeyboardProc _proc = HookCallback;
    
            
    
            private static IntPtr _hookID = IntPtr.Zero;
    
            public static void Main()
            {
                _hookID = SetHook(_proc);
    
                Application.Run();
    
                UnhookWindowsHookEx(_hookID);
            }
    
            private static IntPtr SetHook(LowLevelKeyboardProc proc)
            {
                using (Process curProcess = Process.GetCurrentProcess())
                {
                    using (ProcessModule curModule = curProcess.MainModule)
                    {
    
                        return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
    
                    }
                }
            }
    
            private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
    
            private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
            {
                Process target = Process.GetProcessById(12076);
    
                if (nCode >= 0)
                {
                    int vkCode = Marshal.ReadInt32(lParam);
                    
                    PostMessage(target.MainWindowHandle, (uint)wParam, (uint)vkCode, 1);
                    Console.WriteLine((Keys)vkCode + "  " + (uint)vkCode +"    " + wParam);
                }
    
                return CallNextHookEx(_hookID, nCode, wParam, lParam);
    
            }
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    
            private static extern IntPtr SetWindowsHookEx(int idHook,
    
                LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    
            [return: MarshalAs(UnmanagedType.Bool)]
    
            private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    
            [DllImport("user32.dll")]
            public static extern int PostMessage(IntPtr hWnd, int Msg, uint wParam, uint lParam);
            [DllImport("user32.dll")]
            public static extern int PostMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
    
            [DllImport("user32.dll")]
            public static extern int SendMessage(IntPtr hwnd, int wMsg, uint wParam, uint lParam);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    
            private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    
            private static extern IntPtr GetModuleHandle(string lpModuleName);
    
        }

    The process Id 12076 is a notepad.

    Wednesday, July 24, 2019 3:03 AM

Answers

  • I think that you should post the messages to the child window (multiline textbox) of Notepad, which is responsible for editing operations. The main window (target.MainWindowHandle) is not suitable for these experiments.


    • Edited by Viorel_MVP Wednesday, July 24, 2019 4:46 AM
    • Marked as answer by William A Wang Wednesday, July 24, 2019 5:09 AM
    Wednesday, July 24, 2019 4:45 AM

All replies

  • I think that you should post the messages to the child window (multiline textbox) of Notepad, which is responsible for editing operations. The main window (target.MainWindowHandle) is not suitable for these experiments.


    • Edited by Viorel_MVP Wednesday, July 24, 2019 4:46 AM
    • Marked as answer by William A Wang Wednesday, July 24, 2019 5:09 AM
    Wednesday, July 24, 2019 4:45 AM
  • Holy s**t!! my code works, it's notepad problem, thanks Viorel!!
    Wednesday, July 24, 2019 5:09 AM