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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 02:07   #1
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию Отлов нескольких одновременно нажатых клавиш

Всем доброго времени суток.
Подскажите как одновременно отловить несколько клавиш, попробовал это проделать с ctrl + shift и правой + левой кнопками мыши, получилось конечно, но не очень корректно работает.
Подскажите где ошибся
Код:
int key;
	TCHAR str[100];
	key=wParam;
	
	switch(msg)
	{
	case WM_KEYDOWN:
		{
                     if((wParam==16)| (wParam==17)) //проверка нажатых ctrl + shift
			{
				wsprintf(str,L"Нажата клавиша: Ctrl + Shift");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==16)
			{
				wsprintf(str,L"Нажата клавиша: Shift");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==17)
			{
				wsprintf(str,L"Нажата клавиша: Ctrl");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==13)
			{
				wsprintf(str,L"Нажата клавиша: Enter");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==32)
			{
				wsprintf(str,L"Нажата клавиша: Space");
			SetWindowText(hwnd,str);
			break;
			}
			
			key=wParam;
			wsprintf(str,L"Нажата клавиша: %c",wParam);
			SetWindowText(hwnd,str);
			break;
		}
	case ((WM_RBUTTONDOWN) | (WM_LBUTTONDOWN))://проверка одновременно нажатых кнопок мыши
			{
				wsprintf(str,L"Нажата клавиша: Left_mouse + Right_mouse");
			SetWindowText(hwnd,str);
			break;
			}
	case WM_MBUTTONDOWN:
		wsprintf(str,L"Нажата клавиша: Middle_Mouse");
			SetWindowText(hwnd,str);
			break;
	case WM_LBUTTONDOWN:
			wsprintf(str,L"Нажата клавиша: Left_Mouse");
			SetWindowText(hwnd,str);
			break;
	case WM_RBUTTONDOWN:
			wsprintf(str,L"Нажата клавиша: Right_Mouse");
			SetWindowText(hwnd,str);
			break;
Если нужно вот весь код программы
Код:
#include <Windows.h>
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,LPSTR lpCmdline,int nShow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASSEX wnd;
	wnd.cbSize=sizeof(wnd);
	wnd.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
	wnd.cbClsExtra=0;
	wnd.cbWndExtra=0;
	wnd.style=CS_HREDRAW|CS_VREDRAW;
	wnd.hInstance=hInst;
	wnd.hCursor=LoadCursor(hInst,IDC_ARROW);
	wnd.hIcon=LoadIcon(hInst,IDI_APPLICATION);
	wnd.hIconSm=LoadIcon(hInst,IDI_APPLICATION);
	wnd.lpszMenuName=NULL;
	wnd.lpszClassName=L"MyProg";
	wnd.lpfnWndProc=WndProc;
	if(!RegisterClassEx(&wnd))
	{
		return 1;
	}
	hwnd=CreateWindowEx(0,L"MyProg",L"Key spy",WS_OVERLAPPEDWINDOW,100,200,640,480,NULL,NULL,hInst,NULL);
	ShowWindow(hwnd,nShow);
	UpdateWindow(hwnd);
	while(GetMessage(&msg,NULL,0,0))
	{
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
	int key;
	TCHAR str[100];
	key=wParam;
	
	switch(msg)
	{
	case WM_KEYDOWN:
		{
			if((wParam==16)| (wParam==17))
			{
				wsprintf(str,L"Нажата клавиша: Ctrl + Shift");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==16)
			{
				wsprintf(str,L"Нажата клавиша: Shift");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==17)
			{
				wsprintf(str,L"Нажата клавиша: Ctrl");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==13)
			{
				wsprintf(str,L"Нажата клавиша: Enter");
			SetWindowText(hwnd,str);
			break;
			}
			if(wParam==32)
			{
				wsprintf(str,L"Нажата клавиша: Space");
			SetWindowText(hwnd,str);
			break;
			}
			
			key=wParam;
			wsprintf(str,L"Нажата клавиша: %c",wParam);
			SetWindowText(hwnd,str);
			break;
		}
	case ((WM_RBUTTONDOWN) | (WM_LBUTTONDOWN)):
			{
				wsprintf(str,L"Нажата клавиша: Left_mouse + Right_mouse");
			SetWindowText(hwnd,str);
			break;
			}
	case WM_MBUTTONDOWN:
		wsprintf(str,L"Нажата клавиша: Middle_Mouse");
			SetWindowText(hwnd,str);
			break;
	case (WM_LBUTTONDOWN):
			wsprintf(str,L"Нажата клавиша: Left_Mouse");
			SetWindowText(hwnd,str);
			break;
	case (WM_RBUTTONDOWN):
			wsprintf(str,L"Нажата клавиша: Right_Mouse");
			SetWindowText(hwnd,str);
			break;
	
	

	case WM_DESTROY:PostQuitMessage(0);
	default: 
		
		return DefWindowProc(hwnd,msg,wParam,lParam);
	}
	
	return 0;

}

Последний раз редактировалось revaldo666; 14.02.2012 в 02:38.
revaldo666 вне форума Ответить с цитированием
Старый 14.02.2012, 10:10   #2
flance
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 184
По умолчанию

Что именно значит не очень корректно работает?

Для "горячих клавиш" (включая комбинации типа Ctrl+B и т.п.) следует использовать
http://msdn.microsoft.com/en-us/libr...09(VS.85).aspx
Программист-фрилансер, готовый рассмотреть предложения на постоянную удаленную работу... Ответственный, трудолюбивый
telegram: flancejob
flance вне форума Ответить с цитированием
Старый 14.02.2012, 12:20   #3
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

Это немного не то, мне нужно wParam использовать.
Вот собственно полное задание:
Обработать сообщения нажатия кнопок мыши.
При возникновении сообщения формировать строку и выводить ее в заголовок окна.
Строка должна содержать информацию о нажатых клавишах:

- нажата левая клавиша мыши
- нажата правая клавиша мыши
- нажата средняя клавиша мыши
- нажата клавиша CTRL
- нажата клавиша SHIFT

Если несколько клавиш нажаты одновременно, то НЕОБХОДИМО сообщать об этом.
revaldo666 вне форума Ответить с цитированием
Старый 14.02.2012, 17:41   #4
revaldo666
Форумчанин
 
Регистрация: 24.06.2010
Сообщений: 251
По умолчанию

А можете подсказать на примере моего кода как пользоваться этой функцией(RegisterHotKey) Ато у меня что-то не получается
revaldo666 вне форума Ответить с цитированием
Старый 14.02.2012, 23:09   #5
flance
Форумчанин
 
Регистрация: 31.05.2011
Сообщений: 184
По умолчанию

По ссылке есть пример внизу
Программист-фрилансер, готовый рассмотреть предложения на постоянную удаленную работу... Ответственный, трудолюбивый
telegram: flancejob
flance вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват нажатых клавиш. -=Virus=- Общие вопросы Delphi 8 29.07.2011 17:11
Key Up при нажатых 2х и более клавиш ldenis Общие вопросы Delphi 3 21.01.2011 13:00
Перехват нажатых клавиш sxem Общие вопросы Delphi 7 02.05.2010 23:31
Отлов одновременно нескольких клавиш. Alex Cones Общие вопросы Delphi 7 24.11.2009 17:11
Перехват нажатых клавиш AidarBik Общие вопросы Delphi 2 21.06.2007 20:11