Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2008, 17:07   #1
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
Вопрос Sreen Saver отлов событий

Здраввствуйте!!! Практически написал скрин, да вот небольшая проблемка, когда на файл *.scr жмёш: "установить", то в программу передаётся параметр - "/p хэндл окна", ну я этот хэндл в переменную (hWnd) загнал, далее я хочу, чтобы события этого окна проходили ч/з мою процедуру:
Код:
WndProcSetup PROC
		PUSH EBP
		MOV EBP,ESP
		PUSH EBX
		PUSH ESI
		PUSH EDI
		;----------
			invoke MessageBox,0,0,0,0
		CMP DWORD PTR [EBP+0CH], WM_PAINT
			JE _Paint
		CMP DWORD PTR [EBP+0CH], WM_DESTROY
			JE _Destroy	
		
		JMP _DefWndProc
		;----------
		_Paint:		
			.................
			.................
			JMP _FINISH		
		_DefWndProc:		
			PUSH DWORD PTR[EBP+14H]
			PUSH DWORD PTR[EBP+10H]
			PUSH DWORD PTR[EBP+0CH]
			PUSH DWORD PTR[EBP+08H]
			PUSH lpWndProc
				CALL CallWindowProc
		;----------		
		_FINISH:
		POP EDI
		POP ESI
		POP EBX
		POP EBP
		RET 16
	WndProcSetup ENDP
соответственно я делаю так:
Код:
	PUSH WndProcSetup
	PUSH GWL_WNDPROC
	PUSH hWnd
		CALL SetWindowLong
	MOV lpWndProc,eax
Но почемуто процедура WndProcSetup, ну никак не хочет делать, то что я от неё прошу, хоть бы MessageBox вывела, я проверял в hWnd действительно хэндл окна. Вобщем это подход у меня пока не работает.
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 25.04.2008 в 17:12.
Alexoid вне форума Ответить с цитированием
Старый 25.04.2008, 17:13   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Не совсем понял вводную, окно из этого же процесса?
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 17:38   #3
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

нет!!! Картинка здесь в низу Хандле этого у меня в hWnd, а вот как я его получаю:
Код:
			CMP AL,'p'
			JNE L12
				;-----------УСТАНОВКА
					INC ESI
					INC ESI 
					XOR ebx,	ebx
					MOV EAX,	0 
				LNext: 
					LODSB
					SUB al,30h 
					JB DONE 
					IMUL ebx,10
					ADD ebx,EAX
					JMP LNext
				DONE: 
				MOV hWnd,ebx
В ESI содержится Командная стока Screen Saver`а, допустим: "C:\ssFotoalbum.scr /p 123456"
Цитата:
Сообщение от B_N Посмотреть сообщение
окно из этого же процесса?
А что WinApi SetWindowLong может переопределять прцедуры окон только для окон ( извеняюсь за тавтологию ) процесса этой программы (ssFotoalbum.scr), т.е. где она вызвана. Окна других программ она не может контролировать по их ХЭНДЛу ?
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 25.04.2008 в 18:09.
Alexoid вне форума Ответить с цитированием
Старый 25.04.2008, 17:49   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alexoid Посмотреть сообщение
Хм... Ваша ссылка ничего не дала ввиду отсутствия там картинки, но, так или иначе, SetWindowLong под NT не ставит оконную функцию для окон из других процессов. Это было бы слишком просто. Воспользуйтесь хуком к примеру.
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 18:14   #5
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Всё ясно, я так и понял!!! Да окно другого процесса.
А нет ли какого-то стандартного выхода из этой ситуации, или microsoft об непозаботился, ну для языка VC++ они это решили, введя процедуры обратного вызова ScreenSaverConfigureDialog, ScreenSaverProc и тд. в библиотеке: "ScrnSave.Lib", а тут я должен к нестандартным методам программированя прибегать (ХУКИ использовать) я ВОЗМУЩЁН
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 25.04.2008 в 18:38.
Alexoid вне форума Ответить с цитированием
Старый 25.04.2008, 18:39   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Alexoid Посмотреть сообщение
Всё ясно, я так и понял!!! Да окно другого процесса.
А нет ли какого-то стандартного выхода из этой ситуации, или microsoft об непозаботился, ну для языка VC++ они это решили, введя процедуры обратного вызова ScreenSaverConfigureDialog, ScreenSaverProc и тд. в библиотеке: "ScrnSave.Lib", я ВОЗМУЩЁН
Во-первых, при чём здесь C++? ScreenSaverConfigureDialog он и в Африке ScreenSaverConfigureDialog, какая разница на чём его регистрировать?
Во-вторых, если Вы собираетесь делать превью, то, если память меня не подводит, это делалось "втыканием" дочернего окна в переданное параметром чужое окно (собственно, не такое редкое явление), честное слово не помню деталей, а вовсе не перехватом чужого.
B_N вне форума Ответить с цитированием
Старый 25.04.2008, 19:52   #7
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Хорошо, раз уж я снова( на другом форуме дело было) затронул эту тем давйте разберёмся попорядку

1.
Цитата:
Сообщение от B_N Посмотреть сообщение
Во-первых, при чём здесь C++? ScreenSaverConfigureDialog он и в Африке ScreenSaverConfigureDialog, какая разница на чём его регистрировать?
Я на VC++ тоже писал ScreenSaver, через вот эти ф-ции - у меня получилось, причём я вообще незаморачивался, как получить хандл обработку событий и т.д. и т.п.
Когда на Masm перешёл, сначало я тоже хотел воспользоваться этими ф-циями, тем более, что в Masm32 9 в include`ах и Lib`ах тоже есть scrnsave.inc и scrnsave.lib, но в *.ехе(*.scr) у меня этого не получилось, точка входа в ехе то одна "Start:", вот что мне сказали ТАМ, что: "поидее первый вариант - это exe, второй вариант - это dll", давайте разберёмся для начала с этим, можно ли ScreenSaverConfigureDialog и др ф-ций использовать в МASM, и зачем тогда в него включены scrnsave.inc и scrnsave.lib. Я несовсем понял тех форумчан.

2.
Цитата:
Сообщение от B_N Посмотреть сообщение
Во-вторых, если Вы собираетесь делать превью, то, если память меня не подводит, это делалось "втыканием" дочернего окна в переданное параметром чужое окно (собственно, не такое редкое явление), честное слово не помню деталей, а вовсе не перехватом чужого.
Да чаво уж тут греха таить - я тоже в курсе этого подхода
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 25.04.2008 в 20:09.
Alexoid вне форума Ответить с цитированием
Старый 25.04.2008, 20:18   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

ScreenSaverConfigureDialog - должна быть объявлена экспортной. Какая разница на чём писать, если линкер всё равно везде один? Так что не понял, в чём проблема. А scrnsave.lib включена, очевидно, потому, что это часть Platform SDK. Она даже в DDK есть...
B_N вне форума Ответить с цитированием
Старый 26.04.2008, 15:37   #9
Alexoid
Пользователь
 
Аватар для Alexoid
 
Регистрация: 20.04.2008
Сообщений: 32
По умолчанию

Ну с теоритической базой мне всё понятно, да был неправ, что бочку на микрософт катил, наверное в силу своих поверхностых знаний, реньше прогил в основном на Delphi, а там же, как всё компоненты делают, а если и приходилось к API обращаться, то кое как что-то получалось и да ладно(давало поверхносные знания), короче мне стало ясно, то что предлагет Borland да microsoft идёт к этому со своей техногией FrameworkNet-это чистой воды для облегчения прикладухи (прикладного программирования). Для тех, тех кто хочет познать, все технологии любой ОСи, начать разбираться в них, это надо изучать их снизу , а не сверху (в др. жизненых ситуациях я советы довать не буду кому, как больше нравиться), т.е. с API. Я даже на буду ракомендовать, какой-то определённый Язык программирования (Asm, C или Delphi-Pascal), просто в учебных целях всё решает, то насколько ты, Вы, мы понимаем суть этой технолгии. Вот мой ВЫВОД.

И в заключении, как на практике мне Экспортнуть Screen`вские ф-ии, чтобы их понимала Винда, как точки входа? чето немогу понять, допустим RegisterDialogClasses - это настройка, вот код
Код:

; #########################################################################
	include \masm32\include\windows.inc
	include \masm32\include\user32.inc
	include \masm32\include\kernel32.inc
	include \masm32\include\gdi32.inc
	include \masm32\include\winmm.inc
	include \masm32\include\scrnsave.inc

	includelib \masm32\lib\user32.lib
	includelib \masm32\lib\kernel32.lib
	includelib \masm32\lib\gdi32.lib
	includelib \masm32\lib\winmm.lib
	includelib \masm32\lib\scrnsave.lib

.code
start:
	RegisterDialogClasses PROC EXPORT P:DWORD
		invoke MessageBox,0,0,0,0
		RET
	RegisterDialogClasses ENDP
end start
вот bat`ник :
Код:
@echo off
cls
..\..\bin\rc.exe rsrc.rc
..\..\BIN\ml /c /coff /Cp ssFotoAlbum.asm
..\..\BIN\Link.exe /SUBSYSTEM:WINDOWS ssFotoAlbum.obj rsrc.res /OUT:ssFotoAlbum.scr /export:RegisterDialogClasses

ssFotoAlbum.scr /p 123
Имеющий желание - ищет возможность,
не имеющий желание - ищет причину.
---
Истина где-то рядом

Последний раз редактировалось Alexoid; 26.04.2008 в 16:24.
Alexoid вне форума Ответить с цитированием
Старый 26.04.2008, 17:48   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Alexoid, зачем Вы экспортируете RegisterDialogClasses? Читайте документацию:

Цитата:
RegisterDialogClasses Function

Registers any nonstandard window classes required by a screen saver's configuration dialog box.
................................... ...................
The RegisterDialogClasses function should not be exported. It is called by routines defined in the Scrnsave.lib file.

If a screen saver does not register any special window classes for the configuration dialog box, the RegisterDialogClasses function must return TRUE.
© 2003 Microsoft Corporation. All rights reserved.
Цитата:
ScreenSaverConfigureDialog Function

Receives messages sent to a screen saver's configuration dialog box. A screen saver that allows user configuration must define this function.
................................... ..............
The ScreenSaverConfigureDialog function must be exported by including it in the EXPORTS statement in the application's module-definition (.def) file.
© 2003 Microsoft Corporation. All rights reserved.
http://msdn2.microsoft.com/en-us/lib...97(VS.85).aspx
Вообще все эти тонкости подробно описаны в файле scrnsave.h в PSDK.
Вложения
Тип файла: rar ScrnSave.rar (2.9 Кб, 36 просмотров)
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обраьотка событий Geddar PHP 5 04.07.2008 23:53
Проверка событий в onCreate Михаил Юрьевич Общие вопросы Delphi 5 12.06.2008 13:17
Отлов кликов мыши LAFUDR Помощь студентам 9 24.05.2008 01:32
обработчик событий ben95 Помощь студентам 5 28.01.2008 17:46
Screen Saver на Паскале Акашаев Нурлан Паскаль, Turbo Pascal, PascalABC.NET 4 28.07.2007 21:36