Отправка сообщения WM_KEYUP в окно дает исключение OverflowException

Я пытаюсь реализовать программу, которая отправляет в окно те же сообщения, которые будут отправляться при постоянном нажатии определенной клавиши. Это часть кода (весь код Form1.cs находится здесь) для приложения:

    [DllImport("User32.dll")]
    static extern int SendMessage(IntPtr hWnd, uint wMsg, UIntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, IntPtr windowTitle);

    private void button1_Click(object sender, EventArgs e)
    {
        // find notepad process
        System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("notepad");
        // find child handle of notepad process
        // that is where we can send WM_KEYDOWN, WM_CHAR and WM_KEY up messages to write in the window
        IntPtr childHandle = FindWindowEx(p[0].MainWindowHandle, IntPtr.Zero,"Edit", IntPtr.Zero);

        // WM_KEYDOWN message with parameters for 1st key
        SendMessage(childHandle, (uint)0x0100, (UIntPtr)0x00000041, (IntPtr)(0x001E0001));
        // WM_CHAR message with parameters for 1st key
        SendMessage(childHandle, (uint)0x0102, (UIntPtr)0x00000061, (IntPtr)(0x001E0001));

        // WM_KEYDOWN message with parameters for n-th key
        SendMessage(childHandle, (uint)0x0100, (UIntPtr)0x00000041, (IntPtr)(0x401E0001));
        // WM_CHAR message with parameters for n-th key
        SendMessage(childHandle, (uint)0x0102, (UIntPtr)0x00000061, (IntPtr)(0x401E0001));

        // WM_KEYUP message
        SendMessage(childHandle, (uint)0x0101, (UIntPtr)0x00000041, (IntPtr)(0xC01E0001));
    }

При достижении в коде WM_KEYUP SendMessage программа вылетает и выдает ошибку:

Как я могу исправить эту ошибку? 4 вызова SendMessage перед WM_KEYUP работают нормально, и они отправляют 2 буквы «a» в блокнот.

Спасибо за ваши ответы


person Răzvan Flavius Panda    schedule 13.07.2011    source источник


Ответы (1)


Я предполагаю, что вы компилируете для x86. Для целей x86 0xC01E0001 не является допустимым значением IntPtr (максимальное значение – 0x7FFFFFFF).

2 варианта здесь:

  • Вы используете значение lParam в целевом приложении. В этом случае вы должны использовать другое значение для IntPtr или использовать тип UIntPtr (но этот тип не совместим с CLS).
  • Вы не используете значение lParam в целевом приложении. В этом случае просто передайте IntPtr.Zero как lParam.
person user703016    schedule 13.07.2011
comment
Я выбрал 1-й вариант, так как я хочу как можно больше скопировать непрерывное нажатие клавиши (далее мне нужно сделать задержки), поэтому я заменил IntPtr lParam на UIntPtr lParam, и теперь он работает, как и ожидалось, отправляя сообщение без ошибок. Спасибо! :) - person Răzvan Flavius Panda; 13.07.2011