Как да изпращате натискания на клавиши/съобщения до Windows 7 с C++ и Windows API?

Възможно ли е програма да изпраща натискания на клавиши или съобщения до Windows 7 (операционната система, на която работи), за да симулира ефекта от физическото натискане на потребител на клавиша Windows на клавиатурата, например; в C++, използвайки Windows API?


person TheResolute    schedule 08.02.2012    source източник


Отговори (3)


Функцията SendInput е на разположение от векове и трябва да прави точно това, от което се нуждаете.

person rodrigo    schedule 08.02.2012

Начинаещите често се опитват да изпратят ключове на Windows, защото смятат, че това е най-лесното решение. Със сигурност е лесно да се отговори, като се каже, че е възможно. Често, след като разработчикът инвестира значително време, става сложно. Една от причините да е сложно е, че трябва да се уверите, че контролата (текстовото поле или каквото и да е друго) има фокус. След това трябва да направите нещо, за да обработите данните, например да натиснете бутон. Може да се наложи да прочетете прозореца, за да решите какво да правите по-нататък.

Алтернатива е да преминете ниво нагоре и да се опитате да контролирате приложение чрез достъп до контролите и техния родител (прозорец). С други думи, можете да поставите данни в текстово поле директно като низ, а не чрез въвеждане на ключове в него. Можете да изпратите уведомително съобщение BN_CLICKED до wndow, вместо да изпратите клавиш за въвеждане на бутона, за да щракнете върху бутона. Трябва да потърсите начини да направите този тип неща. Напълно е възможно.

Запознайте се със Spy++; това е инструмент, който наистина може да ви помогне да изследвате контролите, прозорците и други подобни.

person Sam Hobbs    schedule 08.02.2012
comment
+1, но имайте предвид, че някои приложения реагират на съобщенията на прозореца по неочакван начин, така че често е необходимо да се върнете към използването на натискания на клавиши. - person Harry Johnston; 08.02.2012
comment
Съгласен съм, че няма лесни отговори. Съгласен съм, че изпращането на натискания на клавиши може да бъде добро решение. Просто исках да подчертая, че често е по-лесно и по-надеждно да се използват алтернативни решения. Най-добрият отговор е уникален за всяко приложение. - person Sam Hobbs; 09.02.2012

Можете да направите всяко симулирано въвеждане, като използвате SendInput обаче вие ​​сте обвързани от нивото на интегритет на приложението (т.е. не можете да инжектирате въвеждане в приложения, които имат по-високо ниво от вашето).

person Necrolis    schedule 08.02.2012