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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2010, 11:38   #1
cw_o
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 92
По умолчанию Перехват нажатия клавиши

Есть диалог, на нем RichEdit, в котором фокус ввода (причем он нужен только для вывода, т.е. ReadOnly). Проблема такая: нужно отлавливать нажатия клавиш в процедуре главного окна - диалога, а сообщение WM_KEYDOWN ему не приходит - возможно, из-за того что его Richedit принимает. Подскажите, что сделать - я не совсем хорошо понимаю, как функционирует этот обмен сообщениями в API.
cw_o вне форума Ответить с цитированием
Старый 04.04.2010, 03:53   #2
Andrey32
Пользователь
 
Аватар для Andrey32
 
Регистрация: 30.03.2010
Сообщений: 17
По умолчанию

на счет окна незнаю, но для перехвата во всем windows подойдет
Код:
if getasynckeystate(код клавиши)<>0 then...
Andrey32 вне форума Ответить с цитированием
Старый 05.04.2010, 09:49   #3
cw_o
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 92
По умолчанию

Почему-то функция getasynckeystate реагирует на нажатие с большим опозданием, или через раз. Должен быть более правильный способ...
cw_o вне форума Ответить с цитированием
Старый 05.04.2010, 14:37   #4
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

вот мы используем функцию getasynckeystate , она подойдёт если пользоваться на с++ винайпи в вижуале? как я понял функции одни и те же, так?
Dimarik вне форума Ответить с цитированием
Старый 05.04.2010, 14:52   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
как я понял функции одни и те же, так?
АПИ оно везде АПИ, независимо от языка, часто бывают надстройки над АПИ(в Делфи например)
по делу, я б наверно определил Ричу свою оконную функцию, в которой обрабатывать нужные сообщения(но не забываем что нужно и оригинальной передавать управление, особенно на все остальные сообщения).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 05.04.2010, 22:23   #6
cw_o
Пользователь
 
Регистрация: 25.10.2009
Сообщений: 92
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
по делу, я б наверно определил Ричу свою оконную функцию
Так и сделала в итоге, только внутри этой функции отправила нужное сообщение родительскому окну
cw_o вне форума Ответить с цитированием
Старый 30.01.2011, 13:30   #7
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Присоединюсь к теме, только вопрос не в перехвате на делфи, а на плюсах.
Читаю книжку Румянцева "Азбука программирования". Он привёл пример как сделать хук WH_CALLWNDPROC, я попробовал его переделать под перехват клавиш, только у меня возникают ошибки во время выпроления.

Код:
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
{/*если (nCode==HC_ACTION) то процедура хука должна обрабатывать сообщение
 в противном случае мы должны передать сообщение на обработку следующему хуку в цепочке
 при помощи вызова функции CallNextHookEx() и вернуть значение, возвращаемое этой функцией
 
 если второй аргумент не равен нулю, то сообщение послано текущим процессом
 
 наибольшие интерес представляет третий аргумент, которой является структурой typedef struct tagCWPSTRUCT,
 в которой есть поля
 LPARAM lParam;
 WPARAM wParam;
 UINT message;
 HWND hwnd;

 первое поле lPAram перехватываемого сообщения, второе поле- wParam перехватываемого сообщения
 третье поле - номер сообщения
 четвёртое - хэндл окна, которому послано сообщение
 */
	char cBuffer[0x80];
	DWORD dwNumberOfBytesWritten;

	if (nCode < 0)
		return CallNextHookEx(hHook, nCode, wParam, lParam);
	else
		if(nCode == HC_ACTION)//если первый аргумент принимает значение HC_ACTION, то процедура хука должна обрабатывать сообщение
		{
			//записываем в файл информацию о сообщении
			sprintf(cBuffer, "nCode - %08x", nCode);
			WriteFile(hFile, cBuffer, 17, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "wParam - %08x\n", wParam);
			WriteFile(hFile, cBuffer, 19, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->wParam - %08x\n", ((PCWPSTRUCT)lParam)->lParam);
			WriteFile(hFile, cBuffer, 31, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->wParam - %08x\n", ((PCWPSTRUCT)lParam)->wParam);
			WriteFile(hFile, cBuffer, 31, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->message - %08x\n", ((PCWPSTRUCT)lParam)->message);
			WriteFile(hFile, cBuffer, 32, &dwNumberOfBytesWritten, NULL);
			sprintf(cBuffer, "PCWPSTRUCT->hWnd - %08x\n", ((PCWPSTRUCT)lParam)->hwnd);
			WriteFile(hFile, cBuffer, 29, &dwNumberOfBytesWritten, NULL);
			return CallNextHookEx(hHook, nCode, wParam, lParam);
		}


}

ошибка возникает вот на этом месте:
sprintf(cBuffer, "PCWPSTRUCT->wParam - %08x\n", ((PCWPSTRUCT)lParam)->lParam);
Честно говоря, я особо не понял приведение типа последнего аргумента как это происходит. Как может быть преобразован тип LPARAM к типу структуры.
Подскажите кто что знает плиз
Dimarik вне форума Ответить с цитированием
Старый 30.01.2011, 14:53   #8
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

почему бы не сабклассинг Richedit контла?
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Старый 30.01.2011, 15:03   #9
Dimarik
Форумчанин
 
Аватар для Dimarik
 
Регистрация: 18.04.2009
Сообщений: 688
По умолчанию

Извиняюсь, я не особо понял про что вы. в окне я никаких элементов не создавал. мне надо только осуществить банальный перехват нажатых клавиш
Dimarik вне форума Ответить с цитированием
Старый 30.01.2011, 15:44   #10
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Цитата:
Сообщение от Dimarik Посмотреть сообщение
Извиняюсь, я не особо понял про что вы. в окне я никаких элементов не создавал. мне надо только осуществить банальный перехват нажатых клавиш
OldWndproc=SetWindowLong(hRichEdit, GWL_WNDPROC,(PROC)EditWndProc);
получать управление при поступлении команд ричэдиту вначале будет процедура EditWndProc, которая собственна и будет вами написана. Если сообщение вы не обрабатываете - передвайте далее (параметры те которые приходят в эту вашу процедуру):
CallWindowProc(OldWndProc,hRichEdit ,uMsg,wParam,lParam);
если же обрабатываете, то обработайте и на ваше усмотрение можете просто сделать return и не обрабатывать вообще ничего.
Нет, ну правда..
yuran666666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват клавиши KoBRaAndrey Общие вопросы Delphi 2 27.03.2010 17:43
перехват нажатия клавиш skalt12 Общие вопросы Delphi 4 17.08.2009 13:06
Перехват клавиши mustang007 Общие вопросы Delphi 6 15.04.2009 02:01
Перехват нажатия клавиш. Vi_russ Общие вопросы Delphi 1 02.12.2008 20:25
Перехват нажатия Ctrl Lonix Win Api 3 13.09.2007 18:20