У меня проблемы с отправкой клика в приложение с user32.dll. кнопка не нажимается, но в spy++ появляется сообщение. я использую вин7 х64
Код написан на С#:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FindWindow(string strClassName, string strWindowName);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string lpClassName, string lpWindowTitle);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hwnd, uint Msg, IntPtr wParam, IntPtr lParam);
[DllImport("user32.dll")]
static extern IntPtr GetWindow(IntPtr hWnd, uint wCmd);
//
// Finds a window in the whole tree of childs for a parent window.
//
static IntPtr FindWindowRecursive(IntPtr hParent, string szClass, string szCaption)
{
IntPtr hResult = FindWindowEx(hParent, IntPtr.Zero, szClass, szCaption);
if (hResult != IntPtr.Zero)
return hResult; // found it
// enumerate all childs and if found one that has childs go in
IntPtr hChild = FindWindowEx(hParent, IntPtr.Zero, null, null); // first child
if (hChild != IntPtr.Zero)
{
// let's enumerate
do
{
hResult = FindWindowRecursive(hChild, szClass, szCaption);
if (hResult != IntPtr.Zero)
return hResult; // found it
} while ((hChild = GetWindow(hChild, GW_HWNDNEXT)) != IntPtr.Zero);
}
return IntPtr.Zero; // no childs, so no window was found
}
static void Main(string[] args)
{
IntPtr win = FindWindow("Omnipage17_MainWnd_Class", "Unbenanntes OmniPage-Dokument 1 - OmniPage");
SetForegroundWindow(win);
ShowWindowAsync(win, SW_RESTORE);
IntPtr ButtonHandle = FindWindowRecursive(win, "BarButton", "c");
SetActiveWindow(win);
//sEND Lbuttondown
IntPtr ptr = SendMessage(ButtonHandle, 0x0201, new IntPtr(0x0001), MakeLParam(81,28));
//Thread.Sleep(10);
//Mousemove
ptr = SendMessage(ButtonHandle, 0x0200, new IntPtr(0x0001), MakeLParam(86,24));
//lbuttonup
ptr = SendMessage(ButtonHandle, 0x0202, new IntPtr(0x0001), MakeLParam(81, 28));
//SendMessage(ButtonHandle, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}
Вот сообщения spy++ этой кнопки:
Если я отправляю сообщения, я получаю следующее: я не знаю, если это проблема, но lbuttondown, buttoup появляется 2 раза ( S + R ), и если я нажимаю его вручную, он получает 1 сообщение (P) также пытался сделайте это с помощью WM_CLICK, но тогда у меня с ним такая же проблема
Редактировать: сейчас используется PostMessage, поэтому spy++ показывает те же сообщения, что и при нажатии вручную, но все равно кнопка не нажата
С этой библиотекой у меня та же проблема.
код:
SetForegroundWindow(win);
Rectangle re;
GetWindowRect(ButtonHandle, out re);
Cursor.Position = new Point((re.X + re.Width)/2, (re.Y + re.Height)/2);
WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.LBUTTON);
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.LBUTTON);
Сообщение отправлено, но кнопка не нажата
Изменить:
спасибо за ссылку (http://www.hanselman.com/blog/IntroductionLync2010SuperSimpleAutoAnswerVideoKioskWithFullScreen.aspx), но и с этой библиотекой у меня такая же проблема :/
код:
SetForegroundWindow(win);
Rectangle re;
GetWindowRect(ButtonHandle, out re);
Cursor.Position = new Point((re.X + re.Width)/2, (re.Y + re.Height)/2);
WindowsInput.InputSimulator.SimulateKeyDown(WindowsInput.VirtualKeyCode.LBUTTON);
WindowsInput.InputSimulator.SimulateKeyUp(WindowsInput.VirtualKeyCode.LBUTTON);
Сообщение отправлено, но кнопка не нажата
Изменить2:
Ответ пользователя был удален, потому что я разместил свой комментарий как ответ:
Это не ответ, это относится к вашему вопросу. Это не соответствует вашему коду, очевидно, вы все еще публикуете BM_CLICK. Что неправильно, его нужно отправить, и вы должны либо отправить BM_CLICK, либо опубликовать сообщения мыши. И вы смотрите не в то окно, родитель кнопки получает уведомление BN_CLICK и действует на него. Неправильное состояние клавиатуры процессов было бы типичным режимом отказа. — Ханс Пассант 18 часов назад
В связи с этим, почему это должны быть родительские окна? bcs в spy++ (скриншот ниже, который я искал для этой кнопки (класс: BarButton), и дескриптор, который я получаю из user32.dll, также такой же, как и в spy++