Розроблення програми на мові С для OS Windows
Міністерство освіти і науки України
Житомирський державний технологічний університет
ФІКТ
Кафедра ПЗОТ
Група ПІ-39
Лабораторна робота №5
з курсу «Системне програмування»
на тему: «KeyLock»
м. Житомир
2011 р.
ЗАГОЛОВОК
Завдання 3
Код програми 4
Висновок 8
Завдання
1. Вивчити матеріал викладений у файлі допомоги
2. Створити програму, яка друкує в вікно інформацію про натискання клавіш на клавіатурі в подібну таблицю:
Massege |
Key |
Char |
Repeat |
Scan |
Ext |
Alt |
Prev |
Tran |
Код програми
KEYLOOK.C
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
RECT rect ; //структура, яка буде мiстити розмiри вiкна
int cxChar; //ширина символа
int cyChar; //висота символа
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
static char szAppName[] = "KeyLook" ;
HWND hwnd; //дескриптор вiкна
MSG msg; //структура повiдомлення
WNDCLASSEX wndclass; //структура класу вiкна
wndclass.cbSize = sizeof (wndclass); //розмiр структури класу вiкна
wndclass.style = CS_HREDRAW | CS_VREDRAW; //стиль класу вiкна
wndclass.lpfnWndProc = WndProc; // вiконна процедура
wndclass.cbClsExtra = 0; //резервування додатков. пам’ятi в структурi класу вiкна
wndclass.cbWndExtra = 0; //резервування додатков. пам’ятi в структурi вiкна
wndclass.hInstance = hInstance; //дескриптор екземпляра програми
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); //задання iконки
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); //задання курсораwndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH); //задання кольору фону робоч. областi вiкна
wndclass.lpszMenuName = NULL; //меню класу
wndclass.lpszClassName = szAppName; // iм’я класу
wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); //задання iконки для вiкон данного класу
RegisterClassEx (&wndclass) ;
hwnd = CreateWindow (szAppName, //iм’я классу вiкна
" Keyboard Message Looker ", // заголовок вiкна
WS_OVERLAPPEDWINDOW, // стиль вiкна
CW_USEDEFAULT, // початкове положення по х
CW_USEDEFAULT, // початкове положення по у
CW_USEDEFAULT, // початковий розмiр по х
CW_USEDEFAULT, // початковий розмiр по у
NULL, // дескриптор батькiвського вiкна
NULL, // дескриптор меню вiкна
hInstance, // дескриптор екземпляра програми
NULL) ; // параметри створення
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ; //перемалювання робоч. областi вiкна
while (GetMessage (&msg, NULL, 0, 0))
{
TranslateMessage (&msg); //передача структури в Windows
DispatchMessage (&msg); //вiдправка повiдомлень вiконiй процедурi
}
return msg.wParam ;
}
void ShowKey (HWND hwnd, int iType, char *szMessage, WPARAM wParam, LPARAM lParam)
{
static char *szFormat[2] = { "%-14s %3d %c %6u %4d %3s %3s %4s %4s",
"%-14s %3d %c %6u %4d %3s %3s %4s %4s" } ;
char szBuffer[80] ;
HDC hdc ; //дескриптор контексту пристрою
ScrollWindow (hwnd, 0, -cyChar, &rect, &rect) ;
hdc = GetDC (hwnd) ; //отримання дексриптора контексту пристрою
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; //вибiр шрифту
TextOut (hdc, cxChar, rect.bottom - cyChar, szBuffer,
wsprintf (szBuffer, szFormat [iType],
szMessage, wParam,
(BYTE) (iType ? wParam : ' '),
LOWORD (lParam), //повторення натиснення клавiш
HIWORD (lParam) & 0xFF, //скан код
(PSTR) (0x01000000 & lParam ? "Yes" : "No"), //розширен. клавiатури
(PSTR) (0x20000000 & lParam ? "Yes" : "No"), //чи натиснена клавіша Alt
(PSTR) (0x40000000 & lParam ? "Down" : "Up"), //попереднiй стан клавiши
(PSTR) (0x80000000 & lParam ? "Up" : "Down"))); //теперешнiй стан клавiши
ReleaseDC (hwnd, hdc) ; //звiльнення дескриптора
ValidateRect (hwnd, NULL) ; //вiкно не потребує перемальовування
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
static char szTop[] = "Message Key Char Repeat Scan Ext ALT Prev Tran";
static char szUnd[] = "_______ ___ ____ ______ ____ ___ ___ ____ ____";
HDC hdc ;
PAINTSTRUCT ps ;
TEXTMETRIC tm ;
switch (iMsg)
{
case WM_CREATE : //створення вiкна
hdc = GetDC (hwnd);
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight ;
ReleaseDC (hwnd, hdc) ;
rect.top = 3 * cyChar / 2 ;
return 0 ;
case WM_SIZE : //змiна розмiрiв вiкна
rect.right = LOWORD (lParam) ;
rect.bottom = HIWORD (lParam) ;
UpdateWindow (hwnd) ;
return 0 ;
case WM_PAINT : //перемалювання вікна
InvalidateRect (hwnd, NULL, TRUE) ;
hdc = BeginPaint (hwnd, &ps) ;
SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
SetBkMode (hdc, TRANSPARENT) ;
TextOut (hdc, cxChar, cyChar / 2, szTop, (sizeof szTop) - 1) ;
TextOut (hdc, cxChar, cyChar / 2, szUnd, (sizeof szUnd) - 1) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_KEYDOWN : //при натисненні клавiші, яка не вiдобраається на екранi
ShowKey (hwnd, 0, "WM_KEYDOWN", wParam, lParam) ;
return 0 ;
case WM_KEYUP : //при відпусканні клавiші, яка не вiдобраається на екранi
ShowKey (hwnd, 0, "WM_KEYUP", wParam, lParam) ;
return 0 ;
case WM_CHAR : //при натисненнi на клавiшу яка вiдобраається на екранi
ShowKey (hwnd, 1, "WM_CHAR", wParam, lParam) ;
return 0 ;
case WM_DEADCHAR : // при натисненнi на "нiму" клавiшу
ShowKey (hwnd, 1, "WM_DEADCHAR", wParam, lParam) ;
return 0 ;
case WM_SYSKEYDOWN ://при натисненнi на клавiшу <ALT>
ShowKey (hwnd, 0, "WM_SYSKEYDOWN", wParam, lParam) ;
break ;
case WM_SYSKEYUP : //при відпусканні клавіші
ShowKey (hwnd, 0, "WM_SYSKEYUP", wParam, lParam) ;
break ;
case WM_SYSCHAR : //при натисненнi на <ALT> + <символьна клавiша>
ShowKey (hwnd, 1, "WM_SYSCHAR", wParam, lParam) ;
break ;
case WM_SYSDEADCHAR : // при натисненнi на нiму клавiшу та <Alt>
ShowKey (hwnd, 1, "WM_SYSDEADCHAR", wParam, lParam) ;
break ;
case WM_DESTROY : //при закритi вiкна користувачем
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}
Висновок
Отже, на даній лабораторній роботі було розроблено програму на мові С для OS Windows, яка виводить у вікно інформацію про натиснення клавіш клавіатури. програмування клавіатура windows