Мне нужно автоматизировать стороннюю программу, и единственное действие - смоделировать нажатие на некоторые кнопки.
Я делаю это, находя HWND дескриптор кнопки с EnumChildWindows
. Когда я нашел «окно» (кнопка), я пытаюсь отправить ему BM_CLICK
с помощью SendMessageW
. Это работает, мои тесты показывают, что кнопка действительно думает, что она нажата.
Проблема возникает в моей обработке ошибок. Сообщение BM_CLICK
не дает обратной связи, поэтому я не знаю, было ли оно нажато. Я думал, что должен быть усердным и проверить любые коды ошибок, хотя с Marshal.GetLastWin32Error
.
Это возвращает ERROR_PROC_NOT_FOUND
, что не совсем то, что я ожидал бы от успешной обработки сообщений.
Я импортирую SendMessageW
следующим образом:
[DllImport("User32.dll",
CharSet = CharSet.Unicode,
CallingConvention = CallingConvention.Winapi,
SetLastError = true)]
public static extern IntPtr SendMessageW(
HandleRef hWnd,
UInt32 Msg,
UIntPtr wParam,
IntPtr lParam);
Код звонка:
User32.SendMessageW(
buttonHandle,
(uint)ButtonControlMessages.BM_CLICK, // value of BM_CLICK = 0x00F5.
UIntPtr.Zero,
IntPtr.Zero);
int error = Marshal.GetLastWin32Error();
if (error != ErrorCodes.ERROR_SUCCESS) // love the name of this error code.
throw new Win32Exception(error);
Мои тесты просто используют простые Windows Forms с прикрепленной кнопкой. Таким образом, я могу достать ручку через button.Handle
. На него нажимают; может быть, эта ошибка совершенно не связана?
Конечно, было бы неплохо избавиться от этого, но я бы хотел каким-то образом быть уверенным, что вызов SendMessageW
, по крайней мере, не закончился.
Я на Windows 7 x86-32 с .NET 4.