· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Резидентная программа без окна

Посл.отвђт Сообщенiе


Дата: Июл 7, 2003 00:18:03

Как сделать резидентную программу без окна? Нужно чтобы можно было зарегистрировать горячую клавишу и при ее нажатии выполнить какое-либо действие. Т.е. нужно отлавливать событие (WM_HOTKEY). Но как? Ведь формы нет!
И как сделать чтобы программа висела в памяти постоянно и не сильно грузила комп (занимала поменьше места в памяти)?

Все это нужно сделать для Виндовз.

Заранее спасибо!


Дата: Июл 7, 2003 03:28:15

А если сделать окно не видимым?


Дата: Июл 7, 2003 03:42:29 · Поправил: Evld

вот примерчик
hotkey.zip

запусти, нажми F1...


Дата: Июл 7, 2003 04:11:57 · Поправил: Four-F

[ Gloomy: Как сделать резидентную программу без окна? ]

Никак. Зарегистрировать хоткей не имея окна невозможно. Единственное, что мне приходит на ум, это похукать какое-нить постоянно болтающееся в системе окно, например Program Mannager, и заставить его зарегистрировать хоткей на себя. В хуковой процедуре отлавливать приходящие к нему WM_HOTKEY и пересылать к себе через мар-файл, например или делать там что те надо. Синхронизироваться событием.

В твоем следящем процессе окон вообще никаких не будет, но тем не менее память жрать он будет. Ну может раза в два поменьше.

Но это очень извратно и не понятно зачем. Чего там экономить. Ну будет у тя невидимая "форма", ну будет твой процесс занимать какую-то память и грузить комп на 0.000001% ну и что с того? Какая такая необходимость этого избежать? Почему не сделать по традиции, как выше предлагают?


Дата: Июл 7, 2003 14:09:05

Оказывается можно зарегистрировать хоткей без окна:
start proc

local msg:MSG

	invoke RegisterHotKey, NULL, 0001h, 0, VK_F1

	.while TRUE
		invoke GetMessage, addr msg, NULL, 0, 0

		lea edx, msg
		assume edx:ptr MSG
		.if [edx].message == WM_HOTKEY
			.if [edx].wParam == 0001h
				; что-то делаем

				; если сделали
				invoke UnregisterHotKey, NULL, 0001h
				.break
			.endif
		.endif
		assume edx:nothing
	.endw

	invoke ExitProcess, 0

start endp


Окон не будет. Но все равно будет создана очередь сообщений, а это почти те же расходы что и с окном.

Можно вот еще что сделать. Внедрить длл в какой-нить системный процесс, она создаст поток и зарегистрирует хоткей. И все будет происходить в этом самом процессе. Только SEH обязательно поставить надо, иначе если что умрет поток вместе с системным процессом и самой системой соответственно. В смысле расходов памяти расходы будут минимальны и никаких новых процессов. Но это не культурно, хотя можно и так. Главное знать зачем.


Дата: Июл 7, 2003 15:53:09

> Можно вот еще что сделать. Внедрить длл в какой-нить системный процесс
Ага, только на это может и прав не хватить.
Можно вообще писать keyboard filter driver. :-)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066