Russian Qt Forum
Май 05, 2024, 16:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: [РЕШЕНО] снять ограничение на размер чужого окна  (Прочитано 24806 раз)
Bepec
Гость
« Ответ #15 : Май 31, 2013, 20:54 »

Рассматриваю то решение (и единственное возможное, насколько я понимаю).

1) используется замена оконной функции обработки событий (ф-цией SetWindowLongPtr). Эта функция может быть применена только из того потока, который владеет окном.

2) эта функция должна указать адрес функции, которая будет заменой стандартной. Таким образом функция-замена должна быть загружена в адресное пространство потока, владеющего окном.

3) !!!этого момента в коде нет!!! Путём хитрых манипуляций получаем адресное пространство нужного нам потока и перебрасываем туда функцию-замену из своего адресного пространства.

4) используется глобальный хук (в виде dll, подгружаемой во все процессы) на обработчик оконных событий. Хук вызывает калбек функцию в контексте каждого процесса по отдельности.

5) в момент вызова каллбек функции в адресном пространстве нужного нам потока, мы сохраняем адрес текущей функции и заменяем оконную функцию на нашу, которая переброшена нами в адресное пространство нужного нам потока.

6) вуаля. По идее имеем 100% успех, но я не проверял пока на практике данный код. (ток вот за комп сел Веселый пятница ёмоё!)

PS у меня есть пункты 1,2,4,5. До третьего я сам только начал доходить Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #16 : Май 31, 2013, 22:50 »

вот оно где собака зарыта оказывается с этим хуком

3) а это разве не оно?
Код
C++ (Qt)
// Microsoft linker helper for getting the DLL's HINSTANCE.
// See http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx for more details.
//
// If you need to link with a non-MS linker, you would have to add code to look up the DLL's
// path in HKCR.  regsvr32 stores the path under the CLSID key for the 'Snapsie.CoSnapsie' interface.
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
...
// Get the path to this DLL so we can load it up with LoadLibrary.
TCHAR dllPath[_MAX_PATH];
GetModuleFileName((HINSTANCE) &__ImageBase, dllPath, _MAX_PATH);
 
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #17 : Июнь 01, 2013, 21:18 »

Насколько я понимаю, это код загрузки dll хука.

Хотя при более пристальном рассмотрении я в недоумении.

Функция DLL находится в cpp... При этом должен становиться глобальный хук, который обязательно должен быть в dll... Не, непонятно вообще как это работает.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #18 : Июнь 07, 2013, 11:44 »

2Bepec: получилось чего?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #19 : Июнь 07, 2013, 12:18 »

Не, испытания пошли - проект у меня пока лежит. На выходных покопаюсь. Такая вот работа Улыбающийся

PS дайте какую нибудь подопытную программу с таким ограничением!!! А то я чет не найду подходящую, а точнее жертву.
« Последнее редактирование: Июнь 07, 2013, 18:38 от Bepec » Записан
Bepec
Гость
« Ответ #20 : Июнь 17, 2013, 13:52 »

up.

PS что в качестве цели ставится? Снятие ограничения с окна, имеющего минимальные и максимальные размеры, или же с окна, у которого нет растягивающейся рамки?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #21 : Июнь 17, 2013, 13:58 »

снять ограничение на минимальный размер (стоит 800х600), стрелочки растягивания есть
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #22 : Июль 01, 2013, 11:58 »

Дайте мне программу, которую необходимо растянуть Веселый У меня в принципе готово всё для тестов, только подопытный нужен Веселый
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #23 : Июль 01, 2013, 12:04 »

целевое окно — Diablo 3, но в принципе подойдет любое с фиксированным размером (можно быстро накидать винапи программу, которая обрабатывает злополучное сообщение). и надо не растянуть, а «стянуть» Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #24 : Июль 02, 2013, 09:19 »

Ыть дябла три. Я её не видел ниразу Показает язык

Т.е. нужно уменьшить. Оукей посмотрю. (не на дьябле Улыбающийся )
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #25 : Июль 16, 2013, 20:38 »

2Bepec: получилось что-то?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #26 : Июль 16, 2013, 22:09 »

Получилось но с оговорками. Всего ограничений на размер окна я насчитал 3 - максимальный размер, установленный флаг нерастягивающихся границ и флаг при изменении геометрии окна. Максимальный размер я смог переопределить. Флаги и границы - нет. Тот же тотал игнорирует мои потуги, правда qt шное моё адекватно реагирует.

PS завтра/послезавтра выкрою время, вспомню что да как и постараюсь привести в удобочитаемый/компилируемый вид.


update: ковыряю опять систему :/ Как всё тут запущено...
« Последнее редактирование: Июль 22, 2013, 12:47 от Bepec » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #27 : Август 09, 2013, 01:52 »

пациент скорее жив, чем мертв?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Bepec
Гость
« Ответ #28 : Август 09, 2013, 07:01 »

Скорее спит Улыбающийся

Последнее на чём я остановился - перехват оконной процедуры из длл получает только сообщения об активации/деактивации окна. К сожалению завал у меня счас на работе - все в отпусках, один я остался хнык-хнык.
Записан
neversleep
Гость
« Ответ #29 : Август 17, 2013, 15:08 »

Тему не читал(только первый пост), по сабжу: внедряемся в нужный процесс, заменяем оконную процедуру и фильтруем сообщения. К сожалению, сейчас проверить не могу, за не имением венды.

Нашёл свой старый код на delphi по внедрению dll в чужой процесс, думаю, разобраться будет не сложно, т.к тут практически чистый winapi.
(а в самой dll реализация подмены оконной ф-ции и тд)

Код
Pascal
procedure TForm1.Button2Click(Sender: TObject);
var
 Dll: String;
 hMem: Pointer;
 dwTmp: DWORD;
 hProcess, hThread: THandle;
 Injected: Boolean;
begin
 Dll := edtDLL.Text;
 if not FileExists(Dll) then
   Exit;
 
 Injected := False;
 
 hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, ProcessId);
 if hProcess <> 0 then
 begin
   hMem := VirtualAllocEx(hProcess, nil, Length(Dll) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
   if hMem <> nil then
   begin
     WriteMem(hProcess, hMem, PChar(Dll), Length(Dll));
 
     hThread := CreateRemoteThread(hProcess, nil, 0,
       GetProcAddress(GetModuleHandle(kernel32), 'LoadLibraryA'), hMem, 0, dwTmp);
 
     if hThread <> 0 then
     begin
       WaitForSingleObject(hThread, INFINITE);
 
       if GetExitCodeThread(hThread, dwTmp) then
         Injected := dwTmp <> 0;
 
       CloseHandle(hThread);
     end;
 
     VirtualFreeEx(hProcess, hMem, 0, MEM_RELEASE);
   end;
   CloseHandle(hProcess);
 end;
 
 if Injected then
   ShowMessage('Injected');
end;
« Последнее редактирование: Август 17, 2013, 15:10 от neversleep » Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.083 секунд. Запросов: 22.