Findwindow
Содержание
Описание
Поиск хендла окна по его заголовку или PID.
Поиск производится среди окон верхнего уровня, т.е. функция не ведет поиск в дочерних окнах, таких как кнопка, поле ввода и т.д..
Для получения хендла дочернего окна используйте функцию Getwindow.
Подробнее про устройство системы окон Windows вы можете прочитать в Оконная система Windows.
Синтаксис
Привязка к окну: нет.
Работа со свернутым окном: да.
— полное название окна либо его часть.
— номер идентификатора процесса.
Указывается только один из параметров: либо заголовок, либо PID, но не оба сразу.
Порядок поиска следующий:
1. ищем указанную строку в качестве точного названия окон 2. в качестве класса окон 3. в начале названия окон 4. в середине названий окон 5. в качестве ‘pid’ окна
Если в качестве приемника указана числовая переменная, то будет найдено последнее активное окно с заданным заголовком.
Если в качестве приемника указан массив, то будут найдены все окна с заданным заголовком.
Примеры
Смотрите также
История развития
2.14
Добавил функцию:
Возвращает хендл окна, необходимый предыдущей команде. Заголовок окна следует указывать полностью, с соблюдением регистра символов. Если нужное окно не найдено, то регистронезависимо ищем указанную строку в начале названия всех окон. Поиск в скрытых окнах зависит от состояния переключателя «Показывать все окна». если опять ничего не нашли, то считаем, что указан PID процесса и ищем первое попавшееся окно этого процесса.
2.20
Добавил в ‘findWindow’ возможность искать по классу окна
Добавил в ‘findWindow’ возможность искать в середине названий всех окон. Порядок поиска следующий:
1. ищем указанную строку в качестве точного названия окон 2. в качестве класса окон 3. в начале названия окон 4. в середине названий окон 5. в качестве ‘pid’ окна
Добавил в ‘findWindow’ вывод в лог каким способом найдено окно.
2.21
Отключил вывод в лог ‘findWindow’ каким способом найдено окно, до лучших времен.
2.30
Функция ‘findwindow’, вызванная без параметров (но со скобками) вернет хэндл активного окна.
Добавил в ‘findwindow’ поиск по имени процесса.
Если в качестве приемника в команде ‘findwindow’ указан массив, то записываем в него хендлы и имена ВСЕХ окон, в заголовке которых содержится указанная строка, или процессов, полностью совпадающих с указанным. Регистрозависимо.
2.39
Исправил функцию ‘findwindow’. Ничего не находила при нажатых клавишах «Alt+Tab».
Исправил ошибку в команде ‘set %arr findwindow (caption)’, возникающую при наличии в найденных «caption» символов ‘|’ и ‘/’.
Как найти Handle окна процесса?
Здраствуйте!
Вот решил розобраться какие в C# есть возможности для роботы с процессами. Научился находить pID, pName. А вот Handle окна никак не получается найти (
Как найти Handle окна на примере блокнота
Приветствую. Очень тяжело освоить hadle’ы не имея опыта работы с ними, перечитал много примеров и.

Добрый вечер, вот такая проблема: нужно найти имя активного окна. Handle узнаётся с помощью.

Здравствуйте! Как получить Handle Окна при наведении мышкой и как обозначить окно красным цветом?
Решение

Здравствуйте. Есть приложение на delphi, в которой устанавливается Handle, для того, что-бы можно.

кому-то да понадобиться вот код : private static extern Int32.
Как узнать handle окна по ID процесса
Коллеги, подскажите, что делать. Ситуация в двух словах такая: нужно сделать скриншоты окна.
Как выбрать окно, если его handle не совпадает с handle процесса?
Добрый день! Задача на первый взгляд довольно простая: выбрать окно программы, переместить его в.
Как узнать хэндл окна

Суслик © ( 2004-12-15 18:19 ) [1]
можно по хандлу окна узнать принадлежит ли он процесу
The GetWindowThreadProcessId function retrieves the identifier of the thread that created the specified window and, optionally, the identifier of the process that created the window.
т.е. можно все окна пребрать.
Может иначе можно, я не знаю.

Юрий Зотов © ( 2004-12-15 18:31 ) [2]
> Можно ли по ID просесса узнать хендл окна этого просесса?
Как сказано в [1], можно перебрать все окна процесса. Но для того, чтобы выделить из них нужное Вы должны знать об этом окне еще что-то, кроме того, что оно принажлежит данномк процессу.
Огромное спасибо за направление но всё же
DWORD GetWindowThreadProcessId(
HWND hWnd, // handle of window
LPDWORD lpdwProcessId // address of variable for process identifier
);
что опередавать в hWnd если у меня никакого окна нету предаю 0 ноль и возвращает 🙁

Суслик © ( 2004-12-15 19:21 ) [4]
Ну напрагись, задай вопрос нормально :)) С знаком вопроса, с запятыми и пр.
Я не издеваюсь, я вопроса не понял. Честно. 🙂

Суслик © ( 2004-12-15 19:49 ) [6]
var
h: HWND;
pid: DWord;
h := FindWindowEx(0, 0, nil, nil);
while (h <> 0) do
begin
GetWindowThreadProcessId(h, @pid);
if (pid = pi.dwProcessId) then
<окно принадлежит потоку запущенного процесса>
h := FindWindowEx(0, h, nil, nil); // ищем следующее окно
end;
function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean; stdcall;
begin
Result := True;
PostMessage(Handle, WM_CLOSE, 0, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
SearchHandle(GetCurrentProcessId, @EnumWnd, 0);
end;
SearchHandle ищет все окна заданного процесса. При нахождении очередного окна вызывается функция CallbackFunction, которой в данном случае является EnumWnd. Она посылает WM_CLOSE всем окнам.
Так как вызывается:
SearchHandle(GetCurrentProcessId, @EnumWnd, 0);
то код приводит к посылке сообщений WM_CLOSE всем окнам данного процесса.
> Piter © (15.12.04 22:14) [10]
> function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean;
> stdcall;
BOOL CALLBACK EnumThreadWndProc
Хотя, в данном случае это, возможно, не принципиально,
но, вообще-то, надо поаккуратней с хидерами.
PS Кстати, Toolhelp32 отсутствует в NT4.

Piter © ( 2004-12-16 00:42 ) [12]
Leonid Troyanovsky © (15.12.04 23:03) [11]
BOOL CALLBACK EnumThreadWndProc
Хотя, в данном случае это, возможно, не принципиально,
но, вообще-то, надо поаккуратней с хидерами.
а что не так? Я не понял.

Игорь Шевченко © ( 2004-12-16 10:43 ) [13]
Piter © (16.12.04 00:42) [12]
> а что не так? Я не понял.
Я бы написал вместо
> function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean;
> stdcall;
function EnumWnd(Handle: hwnd; UnicID: LPARAM): BOOL; stdcall;
Ах да, для моего примера [10] нужно подключить юнит TLHelp32
Leonid Troyanovsky © (15.12.04 23:03) [11]
Игорь Шевченко © (16.12.04 10:43) [13]
не знаю. И вообще сомневаюсь, что в WinApi есть понятие «главное окно».
> Piter © (16.12.04 20:16) [15]
> Ах да, для моего примера [10] нужно подключить юнит TLHelp32
Это само собой. Но, этим ты не отвертишься 😉
Формально, NT4 еще имеет право на жизнь, а там такого
понятия, как ToolHelp functions, нет.
Т.е., включаешь ремарку «исключая NT4».

Piter © ( 2004-12-16 23:09 ) [18]
-=SS=- © (16.12.04 22:34) [17]
Незнаю почему но под DELPHI 7 TollHelp32 не работает

Piter © ( 2004-12-16 23:12 ) [19]
И вместо абстрактного «не работает» почему бы не сказать где именно затык?
Я конечно извеняюсь но причем тут EnumWnd.
begin
H := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
If Process32First(H, P) then
Memo1.Lines.Add(P.szExeFile)
until Process32Next(H, P) = False;
Этот код на D5 работает т.е показывает всё процессы, а на D7 не работает т.е не показывает ни одной записи (WIN XP)
кстати Директива stdcall стоит но она используется пожже, но всё равно все работает (Под D5)

Piter © ( 2004-12-17 19:30 ) [21]
Ну и какой смысл в молчанку играть? Почему информацию надо вытягивать, как будто это мне нужно? 🙂
begin
H := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
If Process32First(H, P) then
Memo1.Lines.Add(P.szExeFile)
until Process32Next(H, P) = False;
Нда, я плакаль. Предлагаю найти самому ошибку.
Тупой Copy-Paste приводит к ошибкам 🙂

Piter © ( 2004-12-17 20:50 ) [22]
Сори, это я уже лажанулся. Ты просто переделал пример для поиска процессов. Ок, тогда остаются вопросы:
Piter © (17.12.04 19:30) [21]
Ну и какой смысл в молчанку играть? Почему информацию надо вытягивать, как будто это мне нужно? 🙂
Если под «главным окном» понимать окно для которого создаётся кнопка на панели задач, то можно проверить (с пом GetWindowLong) extended style на наличие признака кнопки на панели задач (WS_EX_APPWINDOW).

Игорь Шевченко © ( 2004-12-17 23:53 ) [24]
GuAV © (17.12.04 23:22) [23]
У окон, отображаемых на Taskbar не обязательно имеется стиль WS_EX_APPWINDOW. Точнее, большинство отображаемых на таскбаре окон этого стиля не имеет 🙂

Piter © ( 2004-12-18 00:44 ) [25]
GuAV © (17.12.04 23:22) [23]
имхо, первое окно, созданное приложением и есть «главное», то есть отображается на Панели Задач
Игорь Шевченко © (17.12.04 23:53) [24]
WS_EX_APPWINDOW
Forces a top-level window onto the taskbar when the window is visible.

Игорь Шевченко © ( 2004-12-18 00:54 ) [27]
GuAV © (18.12.04 00:44) [26]
(Только сделал апгрейд, файлы черт знает где, прошу прощения, что приходится ссылку на сайт давать)
Мой склероз. Я это смотрел несколько дней назад.
Кстати, Ваш критерий тоже неточен 🙂
Проверку из EnumFunctions_60
if (WindowOwner = 0) AND
((ExStyle AND WS_EX_TOOLWINDOW) = 0) AND
((WinStyle AND WS_VISIBLE) <> 0) then
не проходит такое окно
CreateWindowEx(WS_EX_APPWINDOW or WS_EX_TOOLWINDOW,
«BUTTON», «I»»m on taskbar», WS_VISIBLE, 0, 0, 0, 0, HWND_DESKTOP, 0, 0, 0);

Игорь Шевченко © ( 2004-12-18 01:56 ) [29]
GuAV © (18.12.04 01:28) [28]
Спасибо. К сожалению, я практически не обновляю сайт.
Проверка, очевидно должна выглядеть так (надо проверить):
if (WindowOwner = 0) and ((WinStyle and WS_VISIBLE) <> 0) and
(((ExStyle and WS_EX_TOOLWINDOW) = 0) or ((ExStyle and WS_EX_APPWINDOW) <> 0)) then

Piter © ( 2004-12-18 02:21 ) [30]
GuAV © (18.12.04 1:28) [28]
а что ты скажешь на:
Piter © (18.12.04 0:44) [25]
имхо, первое окно, созданное приложением и есть «главное», то есть отображается на Панели Задач
> Игорь Шевченко © (18.12.04 01:56) [29]
> Проверка, очевидно должна выглядеть так (надо проверить):
>
> if (WindowOwner = 0) and ((WinStyle and WS_VISIBLE) <> 0)
> and
> (((ExStyle and WS_EX_TOOLWINDOW) = 0) or ((ExStyle and
> WS_EX_APPWINDOW) <> 0)) then
Проверка должна выглядеть так (можешь проверить):
function IsTaskbarBtnExist(h: HWND): Boolean;
var
exstyle: Longint;
begin
Result:= IsWindowVisible(h);
if Result then
begin
exstyle := GetWindowLong(h, GWL_EXSTYLE);
Result := exstyle and WS_EX_APPWINDOW <> 0;
if not Result and
(exstyle and WS_EX_TOOLWINDOW = 0) then
Result := GetWindowLong(h, GWL_HWNDPARENT) = 0;
end;
end;
> Piter © (18.12.04 02:21) [30]
> GuAV © (18.12.04 1:28) [28]
>
> а что ты скажешь на:
>
> Piter © (18.12.04 0:44) [25]
> имхо, первое окно, созданное приложением и есть «главное»,
> то есть отображается на Панели Задач
В отсутствии определения «главное окно» любое высказывание
может быть представлено как истинное.
PS Собс-но, проще руководстваться целью: «что нужно от
этого окна».
Piter © (18.12.04 2:21) [30]
а что ты скажешь на:
Piter © (18.12.04 0:44) [25]
имхо, первое окно, созданное приложением и есть «главное», то есть отображается на Панели Задач
То что имеет значение не порядок, а стили и владалец.
В VCL приложении обычно ни одна форма не видна на TaskBar, для этого исспользуется окно Application.Handle.
type
TForm1 = class(TForm)
private
< Private declarations >
protected
procedure CreateParams(var Params: TCreateParams); override;
public
< Public declarations >
end;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
// любая из нижеследуючих строк приводит к появлению формы на taskbar
Params.WndParent := HWND_DESKTOP;
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;
Немного поэксперементировав пришел к выводу, что проверка должна выглядеть так:
if (WindowOwner = 0) and ((WinStyle and WS_VISIBLE) <> 0) and ((WinStyle and WS_CHILD) = 0) and
(((ExStyle and WS_EX_TOOLWINDOW) = 0) or ((ExStyle and WS_EX_APPWINDOW) <> 0)) then
GuAV © (18.12.04 17:45) [33]
, что проверка должна выглядеть так:
Хотя нет, правильно в [29]
> GuAV © (18.12.04 17:45) [33]
..
> Немного поэксперементировав пришел к выводу, что проверка
> должна выглядеть так:
От:Tomas Restrepo (winder@bigfoot.com)
Тема:Re: How to EnumWindows.
Группы новостей:microsoft.public.win32.programmer.kernel
Дата:1999/04/06
You have to do some test on each of the windows returned by EnumWindows() to
decide wheter to show it or not. The test were described by Jeffrey Richter in
the Nov «97 issue of MSJ. Quoting:
«The rules the taskbar uses to decide whether a button should be shown
for a window are really quite simple, but are not well documented.
When you create a window, the taskbar examines the window»s extended
style to see if either the WS_EX_APPWINDOW (defined as 0x00040000) or
WS_EX_TOOLWINDOW (defined as 0x00000080) style is turned on. If
WS_EX_APPWINDOW is turned on, the taskbar shows a button for the
window, and if WS_EX_ TOOLWINDOW is turned on, the taskbar does not
show a button for the window. You should never create a window that
has both of these extended styles.
You can create a window that doesn»t have either of these styles. If a
window has neither style, the taskbar decides to create a button if
the window is unowned and does not create a button if the window is
owned.
One final note: before making any of the above tests, the taskbar
first checks to see if a window has the standard WS_VISIBLE window
style turned on. If this style bit is off, the window is hidden; the
taskbar never shows a button for a hidden window. Only if the
WS_VISIBLE style bit is on will the taskbar check the WS_EX_APPWINDOW,
WS_ EX_TOOLWINDOW, and window ownership information.»
Which, BTW, David Lowndes has posted in this group several times in the past
Leonid Troyanovsky © (18.12.04 18:31) [35]
PS: интересный спор ни о чём.

Piter © ( 2004-12-18 18:51 ) [37]
Leonid Troyanovsky © (18.12.04 14:04) [32]
В отсутствии определения «главное окно» любое высказывание
может быть представлено как истинное
> > имхо, первое окно, созданное приложением и есть
>»главное»,
> > то есть отображается на Панели Задач
2 Piter © (18.12.04 18:51) [37]
GuAV © (18.12.04 17:45) [33]
GuAV © (18.12.04 17:45) [33]
То что имеет значение не порядок, а стили и владалец.
> GuAV © (18.12.04 18:43) [36]
А причем тут WS_CHILD?
Речь шла про EnumWindows & top-level windows.
> PS: интересный спор ни о чём.
Findwindow
Содержание
Описание
Поиск хендла окна по его заголовку или PID.
Поиск производится среди окон верхнего уровня, т.е. функция не ведет поиск в дочерних окнах, таких как кнопка, поле ввода и т.д..
Для получения хендла дочернего окна используйте функцию Getwindow.
Подробнее про устройство системы окон Windows вы можете прочитать в Оконная система Windows.
Синтаксис
Привязка к окну: нет.
Работа со свернутым окном: да.
— полное название окна либо его часть.
— номер идентификатора процесса.
Указывается только один из параметров: либо заголовок, либо PID, но не оба сразу.
Порядок поиска следующий:
1. ищем указанную строку в качестве точного названия окон 2. в качестве класса окон 3. в начале названия окон 4. в середине названий окон 5. в качестве ‘pid’ окна
Если в качестве приемника указана числовая переменная, то будет найдено последнее активное окно с заданным заголовком.
Если в качестве приемника указан массив, то будут найдены все окна с заданным заголовком.
Примеры
Смотрите также
История развития
2.14
Добавил функцию:
Возвращает хендл окна, необходимый предыдущей команде. Заголовок окна следует указывать полностью, с соблюдением регистра символов. Если нужное окно не найдено, то регистронезависимо ищем указанную строку в начале названия всех окон. Поиск в скрытых окнах зависит от состояния переключателя «Показывать все окна». если опять ничего не нашли, то считаем, что указан PID процесса и ищем первое попавшееся окно этого процесса.
2.20
Добавил в ‘findWindow’ возможность искать по классу окна
Добавил в ‘findWindow’ возможность искать в середине названий всех окон. Порядок поиска следующий:
1. ищем указанную строку в качестве точного названия окон 2. в качестве класса окон 3. в начале названия окон 4. в середине названий окон 5. в качестве ‘pid’ окна
Добавил в ‘findWindow’ вывод в лог каким способом найдено окно.
2.21
Отключил вывод в лог ‘findWindow’ каким способом найдено окно, до лучших времен.
2.30
Функция ‘findwindow’, вызванная без параметров (но со скобками) вернет хэндл активного окна.
Добавил в ‘findwindow’ поиск по имени процесса.
Если в качестве приемника в команде ‘findwindow’ указан массив, то записываем в него хендлы и имена ВСЕХ окон, в заголовке которых содержится указанная строка, или процессов, полностью совпадающих с указанным. Регистрозависимо.
2.39
Исправил функцию ‘findwindow’. Ничего не находила при нажатых клавишах «Alt+Tab».
Исправил ошибку в команде ‘set %arr findwindow (caption)’, возникающую при наличии в найденных «caption» символов ‘|’ и ‘/’.
Как узнать хендл чужого окна свёрнутого в трей?
Ребята подскажите по такому вопросу можно ли как-нть узнать хендл чужого окна свёрнутого в трей?
Если можно, то можно ли потом добраться до конкретного контрола?
Как узнать хендл окна
Здравствуйте Уважаемые товарищи программисты! Подскажите, пожалуйста, как можно узнать хендл.
Найти хендл чужого окна, зная его атом
как можно найти хендл чужого окна по атому??
Узнать размер рамки чужого окна
Нужно узнать размер рамки чужого окна.
Как обратиться к компоненту форму, зная хендл ее окна?
Знаю HWND. формы. TForm *f; HWND *h=f->Handle; Как обратиться к форме и её компоненту по.
[C++ Error] Unit1.cpp(26): E2451 Undefined symbol ‘WM_SHOW’
Добавлено через 27 минут
Сделал так
Добавлено через 6 минут
Sasha,
можно и
К сожалению ни один из твоих способов не помогает. Я не могу заставить запуститься главное окно из иконки возле часов.
К сожалению этот код не помог
Уверен, что окно так называется? Выведи весь список и посмотри =)
Как отследить событие сворачивания окна в системный трей?
Добрый день. Помогите разобратся, как можно отследить сворачивание окна в системный трей. И.

Как зная Хендл объекта чужого приложения, узнать поля этого объекта?
Как узнать хендл окна (кнопки), если есть часть его текста?
Как узнать хендл окна(кнопки) если есть часть его текста, и хендл родительського окна, и хендл.





