Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.05.2012, 16:56   #1
srh
 
Регистрация: 12.05.2012
Сообщений: 4
По умолчанию Приложение игнорирует SendInput

Понимаю, что тема несколько заезженная и всё такое, но тем не менее.

Есть некое приложение, которое при нажатии в нем клавиш получает такие сообщения (записано через spy++)
Код:
<02203> 000C04B0 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01910355
<02204> 000C04B0 P WM_CHAR chCharCode:'0065' (101) cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<02205> 000C04B0 P WM_KEYDOWN nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<02206> 000C04B0 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01920355
<02207> 000C04B0 P WM_KEYUP nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

<02208> 000C04B0 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01930355
<02209> 000C04B0 P WM_CHAR chCharCode:'0065' (101) cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<02210> 000C04B0 P WM_KEYDOWN nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<02211> 000C04B0 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01940355
<02212> 000C04B0 P WM_KEYUP nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

<02213> 000C04B0 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01950355
<02214> 000C04B0 P WM_CHAR chCharCode:'0065' (101) cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<02215> 000C04B0 P WM_KEYDOWN nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<02216> 000C04B0 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01960355
<02217> 000C04B0 P WM_KEYUP nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
и т.д.

написал программу, использующую sendinput и пару хуков чтобы сообщения, посылаемые системой от вызванных мной sendinput, выглядели так:
Код:
<00334> 003403E2 P WM_INPUT nInputCode:RIM_INPUT hRawInput:006B04AF
<00335> 003403E2 P WM_CHAR chCharCode:'0065' (101) cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00336> 003403E2 P WM_KEYDOWN nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00337> 003403E2 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01560315
<00338> 003403E2 P WM_KEYUP nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

<00339> 003403E2 P WM_INPUT nInputCode:RIM_INPUT hRawInput:00EC0081
<00340> 003403E2 P WM_CHAR chCharCode:'0065' (101) cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00341> 003403E2 P WM_KEYDOWN nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00342> 003403E2 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01160339
<00343> 003403E2 P WM_KEYUP nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:1 fUp:1

<00344> 003403E2 P WM_INPUT nInputCode:RIM_INPUT hRawInput:01580315
<00345> 003403E2 P WM_CHAR chCharCode:'0065' (101) cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00346> 003403E2 P WM_KEYDOWN nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:0 fUp:0
<00347> 003403E2 P WM_INPUT nInputCode:RIM_INPUT hRawInput:006D04AF
<00348> 003403E2 P WM_KEYUP nVirtKey:'E' cRepeat:1 ScanCode:12 fExtended:0 fAltDown:0 fRepeat:1 fUp:1
однако приложение на них не реагирует.

Известно, что приложение не перехватывает SendInput и PostMessage глобально как функции, не устанавливает никаких собственных драйверов, не ставит хуков через SetWindowsHookEx.

Может кто-то знает, что я упустил и каким образом приложение игнорирует мои программные нажатия?

Код моей программы см. в следующем посте (лимит 5000 символов):
srh вне форума Ответить с цитированием
Старый 12.05.2012, 16:59   #2
srh
 
Регистрация: 12.05.2012
Сообщений: 4
По умолчанию

Код:
#include <windows.h>
#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <string>

HHOOK hookLLMouse = NULL;
HHOOK hookLLKBoard = NULL;
HHOOK hookMessages = NULL;
HWND hwnd = NULL;
bool keydownMessage = false;

LRESULT WINAPI LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		PKBDLLHOOKSTRUCT pointer = (PKBDLLHOOKSTRUCT)lParam;
		if (pointer->flags & 0x10) std::cout << "Injected keyboard event detected: " << (pointer->flags & 0x10);
		pointer->flags &= 0xEF;
	}
	return CallNextHookEx(hookLLKBoard, nCode, wParam, lParam);
}

LRESULT WINAPI LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		PMSLLHOOKSTRUCT pointer = (PMSLLHOOKSTRUCT)lParam;
		pointer->flags = 0;
	}
	return CallNextHookEx(hookLLMouse, nCode, wParam, lParam);
}

LRESULT WINAPI JournalRecordProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		PEVENTMSG pointer = (PEVENTMSG)lParam;
		UINT hkMessage = pointer->message;
		if (hkMessage == WM_INPUT && hwnd == NULL) 
			hwnd = pointer->hwnd;
		else if (hkMessage == WM_KEYDOWN) keydownMessage = true;
		else if (hkMessage == WM_INPUT && keydownMessage == false)
		{
			if (hwnd != NULL)
				PostMessage(hwnd, WM_CHAR, 0x00000065LU, 0x00120001LU);
		}
		else if (hkMessage == WM_INPUT && keydownMessage == true)
			keydownMessage = false;
	}
	return CallNextHookEx(hookMessages, nCode, wParam, lParam);
}

int main(int argc, const char* argv[])
{
	hookLLMouse = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(NULL), NULL);

	hookLLKBoard = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), NULL);

	hookMessages = SetWindowsHookEx(WH_JOURNALRECORD, JournalRecordProc, GetModuleHandle(NULL), NULL);
	MessageBox(NULL, "Ready.\nDon't close this window", "Ready!", MB_OK);
	UnhookWindowsHookEx(hookLLMouse);
	UnhookWindowsHookEx(hookLLKBoard);
	UnhookWindowsHookEx(hookMessages);
	return 0;
}
SendInput посылаю через autoit

обработку ошибок делаю, не волнуйтесь. Просто не написал, чтобы не занимать место
srh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игнорирует While Nebojitel PHP 2 14.11.2011 21:15
Sendinput отправить текст из tEdit? Retynkol Общие вопросы Delphi 0 15.10.2011 03:34
SendInput TDrive Общие вопросы C/C++ 6 17.07.2011 18:04
SendInput, KeyBD_Event Zirr Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 16.07.2011 13:26
Как обмануть SendInput? MyasNick Win Api 0 25.04.2009 23:03