Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];

Вниз

Хук WH_SHELL и окна консольных приложений / DOS программ   Найти похожие ветки 

 
DVM   (2003-01-27 09:27) [0]

Ставлю глобальный хук WH-SHELL.
Создание / уничтожение окон обычных приложений отслеживатся без проблем, а окна консольных приложений / DOS программ - нет. Как отловить создание таких окон.
Пробовал CBT Hook - то же самое.


 
DVM   (2003-01-27 10:42) [1]

Да, забыл уточнить: под Win98 досовское окно ловится нормально, а под WinXP - консольные окна не ловятся.:(


 
DVM   (2003-01-27 11:35) [2]

Ну кто-нибудь... Что-нибудь...
Неужели никто этого никогда не делал?


 
DVM   (2003-01-27 19:48) [3]

Странно создаются окна консольных приложений в WinXP. Сообщения WM_CREATE и WM_DESTROY для них вообще не передаются. Только WM_Activate удалось поймать. Но это же окна! Уних есть все атрибуты окна.
Как поймать их создание?


 
Cobalt   (2003-01-27 22:38) [4]

Это не баг, это фича ;)
попробуй посмотреть флаги окон - может, они не top-level.

...when the shell application is about to be activated and when a top-level window is created or destroyed.


 
DVM   (2003-01-28 14:46) [5]

Да нет. Top-level - они. Если я вручную инициирую обновление списка окон - они в списке появляются(в списке именно top-level). Их появление не регистрирует хук на WH_SHEL.


 
Cobalt   (2003-01-28 22:05) [6]

>вручную инициирую обновление списка окон
Это как? любопытно.

Попробуйте почитать про консольные приложения. Может, найдете что-нить интересное про консоль?


 
DVM   (2003-01-29 11:25) [7]


> Это как? любопытно.

Как как. Есть ListBox. В нем список окон. Заново перечитываю все окна и добавляю. Я это имел ввиду.


 
Vasily Terekhov   (2003-01-31 09:07) [8]

Ну не ставит WinXP хуки на консольные окна и десктоп. Вот и все.
в хелпе все написано...


 
DVM   (2003-01-31 11:06) [9]

Тогда и Win2000 тоже не ставит - я проверил только что.
Кстати в каком хелпе? От Делфи (версия)?


 
DVM   (2003-01-31 11:22) [10]


> Ну не ставит WinXP хуки на консольные окна и десктоп

HSHELL_WINDOWACTIVATED
- Прекрасно ловится и ставится

HSHELL_WINDOWCREATED и HSHELL_WINDOWDESTROYED - вот эти да, не работают


 
DVM   (2003-01-31 11:24) [11]

И как сама таскбар отслеживает создание консольных окон, через что, если не через хуки?
Или это какое то тайное сообщение ? :)


 
Игорь Шевченко   (2003-01-31 11:25) [12]

DVM © (31.01.03 11:24)

Через хуки. Через обработку сообщения WM_APPCOMMAND


 
DVM   (2003-01-31 11:31) [13]


> Игорь Шевченко

Спасибо, попробую.


 
DVM   (2003-01-31 16:36) [14]

А что это за сообщение такое WM_APPCOMMAND?
Оно не описано в Messages.pas
И какой у него код?


 
Игорь Шевченко   (2003-01-31 17:07) [15]

$0319

Правда, заранее прошу пардону, у меня вся информация по Windows XP на эту тему.


 
Игорь Шевченко   (2003-01-31 17:08) [16]

Вот еще на эту тему:

Registers a specified Shell window to receive certain messages for events or notifications that are useful to Shell applications. The event messages received are only those sent to the Shell window associated with the specified window"s desktop. Many of the messages are the same as those that can be received after calling the SetWindowsHookEx function and specifying WH_SHELL for the hook type. The difference with RegisterShellHookWindow is that the messages are received through the specified window"s WindowProc and not through a call back procedure.

Syntax

BOOL RegisterShellHookWindow( HWND hWnd
);
Parameters

hWnd
[in] Handle to the window to register for Shell hook messages.
Return Value

TRUE if the function succeeds; FALSE if the function fails.




Remarks

As with normal window messages, the second parameter of the window procedure identifies the message as a "WM_SHELLHOOKMESSAGE". However, for these Shell hook messages, the message value is not a pre-defined constant like other message identifiers (IDs) such as WM_COMMAND. The value must be obtained dynamically using a call to RegisterWindowMessage(TEXT("SHELLHOOK"));. This precludes handling these messages using a traditional switch statement which requires ID values that are known at compile time. For handling Shell hook messages, the normal practice is to code an If statement in the default section of your switch statement and then handle the message if the value of the message ID is the same as the value obtained from the RegisterWindowMessage call.

The following table describes the wParam and lParam parameter values passed to the window procedure for the Shell hook messages.

wParam lParam
HSHELL_GETMINRECT A pointer to a SHELLHOOKINFO structure.
HSHELL_WINDOWACTIVATEED The HWND handle of the activated window.
HSHELL_RUDEAPPACTIVATEED The HWND handle of the activated window.
HSHELL_WINDOWREPLACING The HWND handle of the window replacing the top-level window.
HSHELL_WINDOWREPLACED The HWND handle of the window being replaced.
HSHELL_WINDOWCREATED The HWND handle of the window being created.
HSHELL_WINDOWDESTROYED The HWND handle of the top-level window being destroyed.
HSHELL_ACTIVATESHELLWINDOW Not used.
HSHELL_TASKMAN Can be ignored.
HSHELL_REDRAW The HWND handle of the window that needs to be redrawn.
HSHELL_FLASH The HWND handle of the window that needs to be flashed.
HSHELL_ENDTASK The HWND handle of the window that should be forced to exit.
HSHELL_APPCOMMAND The APPCOMMAND which has been unhandled by the application or other hooks. See WM_APPCOMMAND and use the message cracker GET_APPCOMMAND_LPARAM(lParam) to crack this parameter.




 
DVM   (2003-01-31 17:33) [17]

То есть насколько я понял, я должен с помощью недокументированной (The header files included in Windows XP Service Pack 1 (SP1) and WindowsWindows Server 2003 family) функции RegisterShellHookWindow уведомить систему, что указанные выше сообщения слать только моему приложению?


 
DVM   (2003-02-02 01:25) [18]

Что то я никак не разберусь.
Ну достал я процедуру из Шелл32.длл

procedure RegisterShellHookEx(Wnd:hWnd;n:dword);
type TRShH = procedure(aWnd: hWnd; an: dword); stdcall;
var RShH: TRShH;
begin
@RShH := GetProcAddress(GetModuleHandle(PChar("shell32.dll")), pchar(181));
RShH(Wnd,n);
end;

Далее вызвал ее:
RegisterShellHookEx(handle,3);

А дальше то что?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2003.03.31;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.009 c
1-100243
NetKnight
2003-03-18 11:56
2003.03.31
Директива {$IFDEF} ?


14-100385
Andrey
2003-03-11 11:12
2003.03.31
Можно ли считать программу своей


14-100375
Ketmar
2003-03-12 16:20
2003.03.31
водка течёт!!!


6-100352
kol
2003-02-07 13:07
2003.03.31
Порт, используемый SQL сервером


9-100134
AleksWesT
2002-10-28 22:16
2003.03.31
Бойцовский Клуб сделан на Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский