Только успел запоститься и обнаружил причину неудачи с минимизацией.
Ленин
Отдельная функция такого рода не нужна (для мнимизации окна). Нужна функция для установки состояния окна, то есть свернуть/развернуть, максимировать/восстановить, roll-up/roll-down. Вот это было бы действительно полезно.
Никаких проблем не вижу, состояние устанавливается в процессе, все функции уже есть в ядре, нет только соответствующих входов.
Привожу доработку:
Code: Select all
Function 18,22
Минимизация/восстановление окна процесса.
----------------------------------------------------
Параметры:
* eax = 18 - номер функции
* ebx = 22 - номер подфункции
* ecx = Тип операции
0 - минимизация окна (сворачивание на панель) по номеру слота потока
1 - минимизация окна по идентификатору PID/TID
2 - Восстановление минимизированного окна по слоту потока
3 - Восстановление минимизированного окна по идентификатору PID/TID
* edx = Параметр операции (Номер слота или PID/TID)
Возвращаемое значение:
* eax = 0 - Завершилась успешно
-1 - Не получилось.
Дополнительные изменения в файле 'kernel.asm'
В конец таблицы 'sys_system_table' добавить:
Code: Select all
dd sysfn_min_rest_window ; 22 = minimize and restore any window
Среди процедур, следующих за 'sys_system' вставить:
Code: Select all
sysfn_min_rest_window:
pushad
mov eax, ecx ; ebx - operating
shr ebx, 1
jnc @f
call pid_to_slot
@@: ; eax - Номер слота потока
or eax, eax ; eax - number of slot
jz .error
xor ecx, ecx
mov cx, [WIN_STACK + eax*2] ; ecx - window number
mov eax, ecx
shr ebx, 1
jc .restore
; .minimize:
call minimize_window
jmp .exit
.restore:
call restore_minimized_window
.exit:
popad
xor eax, eax
mov [esp+36], eax
ret
.error:
popad
xor eax, eax
dec eax
mov [esp+36], eax
ret
Максимизация пока не поддерживается, не понял я как она производится.