SendMessage CTRL + СТРЕЛКА ВВЕРХ - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь повторить сообщение CTRL + СТРЕЛКА ВВЕРХ, но это похоже на игнорирование клавиши CTRL, в результате получается только отправка СТРЕЛКИ ВВЕРХ без отправки CTRL

Вот как выглядят результаты Spy ++: enter image description here

CTRL KEYDOWN:

enter image description here

СТРЕЛКА ВВЕРХ КЛАВИША:

enter image description here

Клавиша со стрелкой вверх:

enter image description here

Клавиша CTRL:

enter image description here

Это код, который я использую:

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, uint lParam);

SendMessage(whandle, 0x100, 0x00000011, 0x011D0001);
SendMessage(whandle, 0x100, 0x00000026, 0x01480001);
SendMessage(whandle, 0x101, 0x00000026, 0xC1480001);
SendMessage(whandle, 0x101, 0x00000011, 0xC11D0001);

Я изменил эту подпись SendMessage, чтобы принимать KEYUP lParams:

private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, int wParam, uint lParam);

Может быть, подпись не так? Я действительно не знаю, что мне не хватает

Я не могу использовать SendKeys или любой метод, который требует установки окна спереди, он должен работать в фоновом режиме, а также SetKeyBoardState, который может повлиять на другие программы, работающие

РЕДАКТИРОВАТЬ:

Протестировано с PostMessage и я получаю те же результаты, клавиша CTRL игнорируется

PostMessage(whandle, 0x100, 0x00000011, 0x011D0001);
PostMessage(whandle, 0x100, 0x00000026, 0x01480001);
PostMessage(whandle, 0x101, 0x00000026, 0xC1480001);
PostMessage(whandle, 0x101, 0x00000011, 0xC11D0001);

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Используя SendMessage (или PostMessage), вы не можете имитировать состояние клавиш-модификаторов, например, CTRL. Вместо этого вы должны использовать SendInput. [1] [2]

Однако, используя SendInput, вы можете только отправлять ключи в активное окно. Поэтому, если отправка в свернутое / фоновое окно является строгим требованием, я боюсь, что то, что вы пытаетесь сделать, невозможно. [2] [3]

Если вы можете изменить свое требование и достаточно отправить нажатия клавиш в активное окно, или вы можете временно потянуть окно, на которое хотите отправить нажатия клавиш, на передний план, вы Возможно, стоит подумать об использовании библиотеки Input Simulator .

Источники:
[1] { ссылка }
[2] Как отправить Ctrl / Shift / Alt + комбинации клавиш в окне приложения? (через SendMessage)
[3] https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput

0 голосов
/ 01 апреля 2020

Я только что решил аналогичную проблему (используя неуправляемый C ++), однако я посылаю нажатие клавиши в окно DOS, и одной клавишей, а не 2 или более одновременно, вы можете увидеть исходную проблему здесь: Как отправить ввод с клавиатуры на Приложение DOS работает в оконном режиме в Windows98

Я использовал много подходов: SendMessage, SendInput и драйвер VxD, Я также решил проблему с активацией окна перед отправкой нажатия клавиши , вы можете найти проект на github - https://github.com/MossbauerLab/Sm2201Autosave. в MossbauerLab.Sm2201.ExtSaveUtility / src / saveManager вы можете найти метод:

void activWindow (окно HWND);

Я использую имя исполняемого файла и имя окна для поиска HWND (см. MossbauerLab.Sm2201). .ExtSaveUtility / src / utils / windows / windowsInfo.h) Большинство классов были протестированы с помощью тестов MS (управляемый C ++), тестовый проект также находится в этом репозитории: MossbauerLab.Sm2201.ExtSaveUtility.Tests

Возможно, это может быть полезным для вас

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...