Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SetWindowLong

333
11 мая 2006 года
GHopper
200 / / 28.12.2004
Здраствуйте!
Хочу переопределить функцию окна кнопки "Start/Пуск". Внедряю свою dll в ее (кнопкуи Пуск) процесс как учил дядюшка Рихтер.

Код:
extern "C" LRESULT FAR PASCAL WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam);
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.

Спасибо за внимание.
333
14 мая 2006 года
GHopper
200 / / 28.12.2004
Ребята, на вас вся надежда! Нуежели такой сложный вопрос???

Я тут немножко изменил функцию:
Код:
case DLL_PROCESS_ATTACH:
      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. Дело осталось за малым - узнать почему не подменяется оконная процедура?
9.5K
14 мая 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by GHopper
Выдается сообщение "Can`t replace Start button window procedere!".Где я заглючил?



Для того, чтобы это определить, предлогаю изменить код сообщения об ошибке:

 
Код:
if (!m_pBtnProc)
{
   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);
}


Цитата:
Originally posted by GHopper
И еще - написал собственную процедуру окна.Проверил, отладил. Пытаюсь запихать ее в dll, а компилятор ругается на такие строки, как:

TRACKMOUSEEVENT tme;

case WM_MOUSEMOVE:

::_TrackMouseEvent(&tme);

itoa(10, Str, 10);

хотя в exe-модуле все это прекрасно работало!



Как ругается?

Цитата:
Originally posted by GHopper
Как грамотно определить, что курсор мышы вышел за пределы окна?



Обрабатывать WM_MOUSELEAVE.

Цитата:
Originally posted by GHopper
Как в dll-модуле попользовать класс CString?


Код:
#include <windows.h>
#include <atlstr.h>

BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID)
{
   CString msg(L"Hello World!");

   MessageBox(0, msg, 0, 0);

   return TRUE;
}


Цитата:
Originally posted by GHopper
Неужели все программы использующие эту технологию считаются вредностными?



А ты можешь представить программу, которая влазит в чужой процесс и при этом является полезной?

333
14 мая 2006 года
GHopper
200 / / 28.12.2004
Значит как ругается компилятор:

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
9.5K
14 мая 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by GHopper
Значит как ругается компилятор:

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.

Цитата:
Originally posted by GHopper
Далее. Предложение принял, изменения внес, получил код ошибки 1400. Где его расшифровать - ума не приложу! Рассказывайте.



1400, это ERROR_INVALID_WINDOW_HANDLE - Недопустимый дескриптор окна. (System Error Codes из MSDN)

Цитата:
Originally posted by GHopper
Еще. Файла с именем atlstr.h на моем компутере не существует! Установлена Visual Studio 6.0



Сочувствую. Проверь, установлена ли библиотека Active Template Library (ATL). Если нет, попробуй установить её с диска Visual Studio.

9.5K
24 мая 2006 года
Damarus
101 / / 08.04.2006
Цитата:
Originally posted by Damarus
Сочувствую. Проверь, установлена ли библиотека Active Template Library (ATL). Если нет, попробуй установить её с диска Visual Studio.



Думаю, что был не прав. В Visual Studio 6.0 вроде нет atlstr.h.

534
24 мая 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by GHopper
Файла с именем atlstr.h на моем компутере не существует! Установлена Visual Studio 6.0

Попробуй cstringt.h

333
27 мая 2006 года
GHopper
200 / / 28.12.2004
Весь код переделал, много глупых ошибок нашол. Книжки почитал, людей поспрашал... Короче тут следующее уже:
После вызова m_pBtnProc = (WNDPROC)SetWindowLong(hStartBtn, GWL_WNDPROC, (LONG)WndProc);
в m_pBtnProc запсывается число -64119. Это вроде бы и не NULL (указывающий на ошибку выполнения функции), но и с адресом прежней процедуры как-то плохо выжется. Отсюда такая ситуация - нужные мне команды я обрабатываю, а вот передать управление предыдущей процедуре не получается... Всмысле return CallWindowProc(m_pWndProc, hWnd, nMsg, wParam, lParam); накрывается! Поэтому после запуска моей чудо-программы все бахается намертво!
У кого какие идеи?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог