SetWindowLong
Хочу переопределить функцию окна кнопки "Start/Пуск". Внедряю свою dll в ее (кнопкуи Пуск) процесс как учил дядюшка Рихтер.
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved) {
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, "DLL_PROCESS_ATTACH", NULL, MB_OK);
hTrayWnd = FindWindow(wndName, NULL);
if (!hTrayWnd) {
MessageBox(0, "Can`t find Tray Window!", "Error!", MB_OK);
ExitThread(1);
}
hStartBtn = FindWindowEx(hTrayWnd, 0, btnType,NULL);
if (!hStartBtn) {
MessageBox(0, "Can`t get Start button handle!", "Error!", MB_OK);
ExitThread(1);
}
m_pBtnProc = (WNDPROC)
SetWindowLong(m_hButton, GWL_WNDPROC, (LONG)WndProc);
if (!m_pBtnProc) {
MessageBox(0, "Can`t replace Start button window procedere!", "Error!", MB_OK);
ExitThread(1); }
break;
case DLL_PROCESS_DETACH:
MessageBox(0, "DLL_PROCESS_DETACH", NULL, MB_OK);
SetWindowLong(m_hButton, GWL_WNDPROC, (LONG)m_pBtnProc);
break;
}
return TRUE;
}
Выдается сообщение "Can`t replace Start button window procedere!".Где я заглючил?
Процесс кнопки открыл так:
hProcess = OpenProcess( PROCESS_ALL_ACCESS, false, ProccesID);
И еще - написал собственную процедуру окна.Проверил, отладил. Пытаюсь запихать ее в dll, а компилятор ругается на такие строки, как:
TRACKMOUSEEVENT tme;
case WM_MOUSEMOVE:
::_TrackMouseEvent(&tme);
itoa(10, Str, 10);
хотя в exe-модуле все это прекрасно работало!
Как грамотно определить, что курсор мышы вышел за пределы окна? Как в dll-модуле попользовать класс CString?
И еще - при внедрении кода в чужой процесс фаирвол и антивирус начинают бить тревогу! ХОрошо, что у фаирвола есть список "Доверенных приложений", а как быть с антивирусом? Неужели все программы использующие эту технологию считаются вредностными? Антивирус NOD32.
Спасибо за внимание.
Я тут немножко изменил функцию:
processID = GetCurrentProcessId();
memset(procces_name, 0, MAX_PATH);
strcpy(procces_name, "unknown name");
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
lppe.dwSize = sizeof(lppe);
if (Process32First(hSnapshot, &lppe))
{
while(Process32Next(hSnapshot, &lppe))
{
if (lppe.th32ProcessID == processID)
{
strcpy(procces_name, lppe.szExeFile);
break;
}
}
}
MessageBox(0, "DLL_PROCESS_ATTACH", procces_name, MB_OK);
Теперь видно, что библиотека действительно подгружается к процессу explorer.exe. Дело осталось за малым - узнать почему не подменяется оконная процедура?
Выдается сообщение "Can`t replace Start button window procedere!".Где я заглючил?
Для того, чтобы это определить, предлогаю изменить код сообщения об ошибке:
{
TCHAR szBuffer[128] = { 0 };
wsprintf(szBuffer, TEXT("Can`t replace Start button window procedere!\nError code: %d"), GetLastError());
MessageBox(0, szBuffer, TEXT("Error!"), MB_OK);
}
И еще - написал собственную процедуру окна.Проверил, отладил. Пытаюсь запихать ее в dll, а компилятор ругается на такие строки, как:
TRACKMOUSEEVENT tme;
case WM_MOUSEMOVE:
::_TrackMouseEvent(&tme);
itoa(10, Str, 10);
хотя в exe-модуле все это прекрасно работало!
Как ругается?
Как грамотно определить, что курсор мышы вышел за пределы окна?
Обрабатывать WM_MOUSELEAVE.
Как в dll-модуле попользовать класс CString?
#include <atlstr.h>
BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID)
{
CString msg(L"Hello World!");
MessageBox(0, msg, 0, 0);
return TRUE;
}
Неужели все программы использующие эту технологию считаются вредностными?
А ты можешь представить программу, которая влазит в чужой процесс и при этом является полезной?
error C2065: 'itoa' : undeclared identifier
error C2065: 'WM_MOUSELEAVE' : undeclared identifier
error C2039: '_TrackMouseEvent' : is not a member of '`global namespace''
Имеются следующие инклуды:
#include "stdafx.h"
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <Tlhelp32.h>
#include <windows.h>
Далее. Предложение принял, изменения внес, получил код ошибки 1400. Где его расшифровать - ума не приложу! Рассказывайте.
Еще. Файла с именем atlstr.h на моем компутере не существует! Установлена Visual Studio 6.0
Значит как ругается компилятор:
error C2065: 'itoa' : undeclared identifier
error C2065: 'WM_MOUSELEAVE' : undeclared identifier
error C2039: '_TrackMouseEvent' : is not a member of '`global namespace''
1. itoa обьевляется в stdlib.h
2. Чтобы включить WM_MOUSELEAVE напиши #define _WIN32_WINNT 0x0400 перед windows.h
3.1. Пиши просто _TrackMouseEvent, без ::
3.2. _TrackMouseEvent обьевляется в commctrl.h, соответственно нужна и Comctl32.lib.
Далее. Предложение принял, изменения внес, получил код ошибки 1400. Где его расшифровать - ума не приложу! Рассказывайте.
1400, это ERROR_INVALID_WINDOW_HANDLE - Недопустимый дескриптор окна. (System Error Codes из MSDN)
Еще. Файла с именем atlstr.h на моем компутере не существует! Установлена Visual Studio 6.0
Сочувствую. Проверь, установлена ли библиотека Active Template Library (ATL). Если нет, попробуй установить её с диска Visual Studio.
Сочувствую. Проверь, установлена ли библиотека Active Template Library (ATL). Если нет, попробуй установить её с диска Visual Studio.
Думаю, что был не прав. В Visual Studio 6.0 вроде нет atlstr.h.
Файла с именем atlstr.h на моем компутере не существует! Установлена Visual Studio 6.0
Попробуй cstringt.h
После вызова m_pBtnProc = (WNDPROC)SetWindowLong(hStartBtn, GWL_WNDPROC, (LONG)WndProc);
в m_pBtnProc запсывается число -64119. Это вроде бы и не NULL (указывающий на ошибку выполнения функции), но и с адресом прежней процедуры как-то плохо выжется. Отсюда такая ситуация - нужные мне команды я обрабатываю, а вот передать управление предыдущей процедуре не получается... Всмысле return CallWindowProc(m_pWndProc, hWnd, nMsg, wParam, lParam); накрывается! Поэтому после запуска моей чудо-программы все бахается намертво!
У кого какие идеи?