У меня есть 2 процесса:
- Процесс пользовательского интерфейса
- Клиентский процесс
Я пытаюсь, чтобы клиентский процесс отправил сообщение в пользовательский интерфейс Thread / * процесса 1030 * таким образом, что это повлияет на его результат GetKeyState. Я хочу повлиять только на GetKeyState процесса пользовательского интерфейса, а не на любой другой процесс.
SendInput повлияет на все процессы, включая этот, но я не пытаюсь этого достичь.
Отправка WM_KEYDOWN + WM_KEYUP действительно обрабатывается, но не влияет на GetKeyState
Есть ли способ (с помощью сообщения или перехвата), чтобы я мог заставить клиента влиять на пользовательский интерфейс без изменения кода пользовательского интерфейса?
Это часть в окне Pro c Я печатаю значение GetKeyState A
:
char* GetTextualKeyState(int nVirtKey) {
short keyState = GetKeyState(nVirtKey);
short KEY_DOWN_MASK = 0b1000000000000000;
short TOGGLED_MASK= 0b1;
const int TEXTUAL_KEY_STATE_LEN = 128;
char* textualKeyState = (char *)calloc(TEXTUAL_KEY_STATE_LEN, sizeof(char));
if (keyState & KEY_DOWN_MASK) {
char down[] = "Down, ";
strcpy_s(textualKeyState, TEXTUAL_KEY_STATE_LEN, down);
}
else {
char up[] = "Up, ";
strcpy_s(textualKeyState, TEXTUAL_KEY_STATE_LEN, up);
}
if (keyState & TOGGLED_MASK) {
char toggled[] = "Toggled";
strcat_s(textualKeyState, TEXTUAL_KEY_STATE_LEN, toggled);
}
return textualKeyState;
BOOL PaintKeyStateOfA(HDC hdc) {
const int VK_A = 0x41;
char* state = GetTextualKeyState(VK_A);
const int CONTENT_LEN = 128;
char labelContent[CONTENT_LEN] = "A KeyState: ";
strcat_s(labelContent, CONTENT_LEN, state);
return TextOutA(hdc, 10, 50, labelContent, strlen(labelContent));
Еще одна вещь, которую я попытался сделать для отладки GetKeyState, - добавить бесконечное l oop внутри GetMessage l oop (сразу после DispatchMessage), который регистрирует выходные данные GetKeyState и видит, что:
- Как и ожидалось, окно застыло
- На напечатанное значение не повлияло
Что мне здесь не хватает?