Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Handle чужого окна.


Neznaika ©   (2003-04-04 11:49:00) 

Пользователь щёлкает мышью по чужому окну. Как получить его handle?


DVM   (2003-04-07 20:16:00) [1]

Форум глючит. В этой ветке снаружи больше сообщений чем внутри


Neznaika   (2003-04-07 11:35:00) [2]

Всем спасибо.


DVM   (2003-04-07 09:59:00) [3]

Вот еще забыл:
procedure RegisterShellHook(Wnd:hWnd;n:dword); stdcall; external "shell32.dll" index 181;


DVM   (2003-04-07 09:56:00) [4]

> Songoku
По мойму это раздел называется Win_API.
это ты правильно подметил.

Поэтому пример будет на WinApi.
Разбирайся. Это подправленный кусок из другой программы, но после небольшой доработки должен заработать.

Именно так панель задач (Windows TaskBar) отлавливает факт появления/исчезновения/изменения top-level окон.

program shelhookdemo;

uses

Windows,
Messages;

const

szName : PChar = "shellhookdemo";
szClass : PChar = "shellhookdemo_class";
magicDWord = $49474541;

RSH_DEREGISTER = 0;
RSH_REGISTER = 1;
RSH_REGISTER_PROGMAN = 2;
RSH_REGISTER_TASKMAN = 3;

HSHELL_ACTIVATESHELLWINDOW = 3;
HSHELL_WINDOWCREATED = 1;
HSHELL_WINDOWDESTROYED = 2;
HSHELL_WINDOWACTIVATED = 4;
HSHELL_GETMINRECT = 5;
HSHELL_REDRAW = 6;
HSHELL_TASKMAN = 7;
HSHELL_LANGUAGE = 8;

cOsUnknown = -1;
cOsWin95 = 0;
cOsWin98 = 1;
cOsWin98SE = 2;
cOsWinME = 3;
cOsWinNT35 = 4;
cOsWinNT4 = 5;
cOsWin2000 = 6;
cOsXP = 7;

var
wc : TWndClassEx;
hMainWnd : HWND;
Mesg :TMsg;
WM_SHELLHOOK : Integer;

function MainWndProc(wnd:HWND; Msg:Integer; wParam:wParam; lParam:lParam):lResult; stdcall;
begin
if Msg = WM_SHELLHOOK then
begin
case wParam of
HSHELL_WINDOWCREATED: ;
HSHELL_WINDOWDESTROYED: ;
HSHELL_WINDOWACTIVATED: ;
HSHELL_REDRAW: ;
end;
end;
case Msg of
WM_CREATE:
begin
result:=DefWindowProc(Wnd, Msg, wParam, lParam);
end;
WM_DESTROY :
begin
Result:=0;
postquitmessage(0);
exit;
end;
else Result:=DefWindowProc(Wnd, Msg, wParam, lParam);
end;
end;
begin
wc.cbSize:=sizeof(wc);
wc.lpfnWndProc:=@MainWndProc;
wc.hInstance:=hInstance;
wc.lpszClassName:=szClass;
wc.hIcon:=LoadIcon(0,idi_application);
wc.hCursor:=LoadCursor(0,idc_arrow);

if RegisterClassEx (wc) = 0 then
begin
MessageBox (0, "Error!", "Error!", MB_OK);
exit;
end;

hMainWnd:=CreateWindowEx(
WS_EX_TOOLWINDOW,
szClass,
szName,
WS_POPUP,
0,0,0,0,0,0,
hInstance,
nil
);
if hMainWnd = 0 then
begin
MessageBox (0, "Error!", "Error!", MB_OK);
UnregisterClass(szClass, hInstance);
exit;
end;

WM_SHELLHOOK := RegisterWindowMessage("SHELLHOOK");
if WM_ShellHook<>0 then
begin
RegisterShellHook(0, 1);
if GetOperatingSystemType <= cOsWinMe then
RegisterShellHook(hMainWnd, RSH_REGISTER)
else
RegisterShellHook(hMainWnd, RSH_REGISTER_TASKMAN);
end;

while GetMessage(Mesg,0,0,0) do
begin
TranslateMessage(Mesg);
DispatchMessage(Mesg);
end;

end.


Snap   (2003-04-06 21:56:00) [5]

Да таких исходников по всему интернету тьма тьмущая, а вы "покожи"!


DVM   (2003-04-06 18:29:00) [6]


> Если Hook ставить то тогда придётся делать DLL.

Это не так! Длл не обязательно нужна именно с WH_SHELL.


> А в любой проге есть главный цикл, вот него можно и вставить
> проверку работу с мышкой.

Главный цикл сообщений? Я бы его не стал трогать, программа может замедлится сильно. К тому же в Delphi (VCL) до него так просто не добраться.


DVM   (2003-04-06 16:23:00) [7]

Да не мучайтесь вы поставьте хук на WH_SHELL там все что надо есть. Циклы, таймеры - это все извращения. В винде и так "одни циклы", зачем свои городить поверх них.


Diamond Cat   (2003-04-06 04:06:00) [8]


> Songoku ©
маразм

при потере (и при получении) фокуса твое окно получает сообщение wm_activate, в нем может содержаться( а может и не содержаться) хэндл окна получившего фокус, если хэндла нет то в реакции на wm_activate делай windowfrompoint


Songoku   (2003-04-05 10:44:00) [9]

Удалено модератором
Примечание: Отправляешься в ReadOnly на время


Song   (2003-04-05 10:29:00) [10]

Если щелчок по окну привёл к установлению фокуса ввода с этим окном, то можно GetFocus()


Songoku   (2003-04-04 20:20:00) [11]

Удалено модератором


Songoku   (2003-04-04 20:20:00) [12]

Удалено модератором


Songoku   (2003-04-04 18:59:00) [13]

Удалено модератором
Примечание: Тебе предупреждение


Songoku   (2003-04-04 18:51:00) [14]

Удалено модератором
Примечание: Offtopic


Songoku   (2003-04-04 18:50:00) [15]

Удалено модератором
Примечание: Материться - в детсад


Songoku   (2003-04-04 14:23:00) [16]

Удалено модератором
Примечание: Если отвечать, то в тему вопроса


Игорь Шевченко   (2003-04-04 13:51:00) [17]

WindowFromPoint ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо