Отправка сообщения 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 письма "а" в блокнот.
Спасибо за ваши ответы
1 ответ
Решение
Я предполагаю, что вы компилируете для x86. На цели x86, 0xC01E0001
не является действительным IntPtr
значение (максимум 0x7FFFFFFF
).
2 варианта здесь:
- Вы используете значение
lParam
в целевом приложении. В этом случае вы должны использовать другое значение дляIntPtr
или используйте типUIntPtr
(но этот тип не совместим с CLS). - Вы не используете значение
lParam
в целевом приложении. В этом случае просто пройтиIntPtr.Zero
какlParam
,