Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват клавиатуры, Курсовая по СПО 
:(
    Опции темы
Cristall512
Дата 8.1.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



Нужно написать невидимую программу, реагирующую на горячие клавиши. По-моему, это делается с помощью перехвата клавиатуры. Вот фрагмент кода:
Код

h=LoadLibrary(_T("keyproc.dll"));
hprc = (HOOKPROC)GetProcAddress(h, "KeyboardProc");
SetWindowsHookEx(WH_KEYBOARD,hprc,h,NULL);


А вот фрагмент из DLL (чисто для теста):
Код

LRESULT CALLBACK KeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{
 if(lParam>0x8000){ mykey();}
 // обрабатываем только когда клавиша нажата (типа WM_KEYDOWN)

 return 0;
} 

void mykey()
{
    if (GetKeyState(VK_SHIFT)>0)
        WinExec("notepad.exe", SW_SHOW);
}


Программа должна реагировать на нажатие SHIFT, но этого не происходит. Где ошибка?
Да, ещё: если поставить вызов блокнота в тело KeyboardProc, тоже ничего не происходит, то есть программа вообще не реагирует на события клавиатуры

Это сообщение отредактировал(а) Cristall512 - 8.1.2011, 19:05
PM MAIL   Вверх
Cristall512
Дата 8.1.2011, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



Добавил кое-что:
Код

h=LoadLibrary(_T("keyproc.dll"));
hprc = (HOOKPROC)GetProcAddress(h, "KeyboardProc");
h2=SetWindowsHookEx(WH_KEYBOARD,hprc,h,NULL);
if(h2!=0)WinExec("notepad.exe", SW_SHOW); //вот это добавил


Теперь блокнот всё равно не вызывается, то есть SetWindowsHookEx не работает... почему? У меня Win7 64
PM MAIL   Вверх
bra1ny
Дата 8.1.2011, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



Цитата

Нужно написать невидимую программу, реагирующую на горячие клавиши.

советую Вам мое более красивое решение. клик
+ не все комбинации легальными способами  можно перехватить , в операционной системе защита стоит .

Это сообщение отредактировал(а) bra1ny - 8.1.2011, 20:26
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
Cristall512
Дата 8.1.2011, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



"Хочется отметить, что в Висте механизм регистрации горячих клавиш немного изменен"

в семёрке, наверное, тоже. у меня семёрка
PM MAIL   Вверх
bra1ny
Дата 8.1.2011, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



изменен тем , что там не список хоткеев а хэш таблица. smile 
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
Dem_max
Дата 9.1.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

советую Вам мое более красивое решение.

Красивое решение это делать на ассемблере ? нет уж спасибо.

Цитата

+ не все комбинации легальными способами  можно перехватить , в операционной системе защита стоит .

Какие например нельзя перехватить ???? Чето не припомню.
Но точно знаю что просто так не перехватишь кнопку Sleep ибо ее раньше всего перехватит винда, а нажатие в систему не выдаст. Перехватить можно если поставить свой драйвер.

2 Cristall512
Вот почитай что попроще.
http://www.xakep.ru/post/29476/default.asp?print=true


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Cristall512
Дата 9.1.2011, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



непонимаю... как там обошлись без длл?
Цитата

Итак, рассмотрим непосредственно перехват клавиатуры. Hook-процедуры для ловушек WH_KEYBOARD_LL и WH_JOURNALRECORD выглядят следующим образом:

.................
Цитата

Заметим, что в нашей программе не будет использования внешней DLL, необходимой для перехвата нажатий клавиш. Процедуры перехвата будут реализованы внутри самой программы.

где и как они вызываются, я так и не понял. где SetWindowsHookEx? как они обошлись без этой функции?

и помогите мне, пожалуйста, найти ошибку в МОЁМ коде... вот новая длл:
Код

#ifndef _DLLTEST_H_
#define _DLLTEST_H_

#include <windows.h>

extern "C" __declspec(dllexport) void mykey();
extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);

#endif

Код

#include "2.h"

extern "C" __declspec(dllexport) void mykey(void)
{
//my code
}

extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
//my code
}

я выяснил, что в основной программе возможно получить адрес ф-ции mykey, но невозможно получить адрес KeyboardProc. Может, в dll функцию типа LRESULT CALLBACK надо описывать как-то по-другому? при наведении курсора мыши на CALLBACK всплывает подсказка #define CALLBACK __stdcall, но у меня стоит соглашение __cdecl. При соглашении __stdcall тоже не работает

Это сообщение отредактировал(а) Cristall512 - 9.1.2011, 12:06
PM MAIL   Вверх
Cristall512
Дата 9.1.2011, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



убрал CALLBACK, заработало, но функция вызывается только один раз... как изменить код, оставив CALLBACK?
PM MAIL   Вверх
Cristall512
Дата 9.1.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



проблема решена. с модификатором callback к имени функции при компиляции добавляется префикс _ и постфикс @12
PM MAIL   Вверх
Cristall512
Дата 9.1.2011, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 29.7.2006

Репутация: нет
Всего: нет



так... ещё проблема. вот код:
Код

#include "2.h"

extern "C" __declspec(dllexport) LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
 if(lParam<0x80000000)
        WinExec("notepad.exe", SW_SHOW);

 return 0;
}

Код

#include "stdafx.h"

//void mykey();    // объявление процедуры 
HOOKPROC hprc;
HINSTANCE h;
HHOOK h2;
HMODULE hm;

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
h=LoadLibrary(TEXT("2"));
hm = GetModuleHandle(TEXT("2"));
hprc = (HOOKPROC)GetProcAddress(hm, "_KeyboardProc@12");
h2=SetWindowsHookEx(WH_KEYBOARD,hprc,h,NULL);
while(1)
Sleep(1000);
return 0;
} 


почему-то при нажатии клавиш при активном окне какого-либо приложения вызывается несколько блокнотов, а должен один. При активном окне каталога или калькулятора (и, наверное, много ещё чего) блокнот не вызывается вообще, а окно перестаёт реагировать на нажатия мыши
PM MAIL   Вверх
bra1ny
Дата 9.1.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 196
Регистрация: 26.12.2008

Репутация: 2
Всего: 3



Цитата

Красивое решение это делать на ассемблере ? нет уж спасибо.

Так на си написано же.
Цитата

Какие например нельзя перехватить ???? Чето не припомню.

crtl+alt+del. 
--------------------
Что вас манит сюдаИз заморзких широт?Там гораздо сытней и красивей.Или воля не та, или воздух не тот -Знать и вам не прожить без России.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.