Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
ВнизУправление чужим окном на более сложном уровне Найти похожие ветки
← →
PL (2004-08-13 16:39) [0]Уважаемые мастера. Передо мной возникло 2 вопроса, которые я не никак не могу решить сам и поэтому прошу Вашей помощи:
1) ОС WinXP. Можно ли из моей программы упралять прозрачностью любого другого окна в системе, зная только его дескриптор?
2)У меня есть handle чужого окна, в котором 3 контрола (3 editbox"а). Можно ли как-нибудь послать сообщение одному из них? Или хотя бы, можно ли получить дескриптор его, а с сообщением я сам справлюсь.
Буду очень признателен за любую информацию по этому вопросу.
← →
Игорь Шевченко © (2004-08-13 16:40) [1]
> 2)У меня есть handle чужого окна, в котором 3 контрола (3
> editbox"а). Можно ли как-нибудь послать сообщение одному
> из них? Или хотя бы, можно ли получить дескриптор его, а
> с сообщением я сам справлюсь.
EnumChildWindows - список дочерних окон в указанном окне.
> 1) ОС WinXP. Можно ли из моей программы упралять прозрачностью
> любого другого окна в системе, зная только его дескриптор?
Скорее всего, нельзя.
← →
PL (2004-08-13 16:43) [2]Спасибо. Попытаюсь.
← →
DeadMeat © (2004-08-13 17:44) [3]1) А я делал такую утилитку, которая делает прозрачными все окна, кроме активного...
---
...Death Is Only The Begining...
← →
Sergey Kaminski © (2004-08-14 06:35) [4]Игорь Шевченко © (13.08.04 16:40) [1]
Скорее всего, нельзя.
Почему же?
const
cUseAlpha: array [Boolean] of Integer = (0, LWA_ALPHA);
cUseColorKey: array [Boolean] of Integer = (0, LWA_COLORKEY);
var
AStyle: Integer;
FTransparentColorValue: Integer;
FAlphaBlendValue: Integer;
AHandle: HWND;
begin
AHandle := FindWindow("Notepad",nil);
if AHandle <> 0 then
begin
FAlphaBlendValue := 200;
AStyle := GetWindowLong(AHandle, GWL_EXSTYLE);
SetWindowLong(AHandle, GWL_EXSTYLE, AStyle or WS_EX_LAYERED);
SetLayeredWindowAttributes(AHandle, FTransparentColorValue, FAlphaBlendValue,
cUseAlpha[True] or cUseColorKey[True]);
end;
end;
Вполне успешно "запрозрачнила" Блокнот.
Большая часть кода выдрана из procedure TCustomForm.SetLayeredAttribs поэтому не пинать,вставлен только поиск "чужого" окна.
← →
Sergey Kaminski © (2004-08-14 06:44) [5]>> PL (13.08.04 16:39)
по поводу 2)
Вот нарыл готовый модуль из своего древнего проекта. Кажется, был работоспособен :)
Помогает освоить работу EnumChildWindows ;)
Да, главная функция в моделе FindAnyWindow, см. комментарий к ней.
unit FindWin;
interface
uses Windows;
//callback-функции объявляем здесь
function MyWinCallback (_handle: hwnd; wininfo: pointer): bool;stdcall;
function MyChildWinCallback (_handle: hwnd;wininfo: pointer): bool;stdcall;
// Сама процедура поиска любого окна в системе с заданными
// именем класса и текстом окна
// возвращает заголовок найденого окна
// или 0, если окна с заданными характеристиками не найдено
function FindAnyWindow (ClassName, WindowText: pchar): hwnd;
implementation
Type
TWinInfo = packed record
WinHandle: hwnd; // тут - заголовок найденого окна
ClassName,
WindowText: string; // данные для сравнения
end;
// заполняет структуру TWinInfo значениями ClassName & WindowText
// для окна, с заголовком _handle
function GetWinInfo (_handle: hwnd): TWinInfo;
var _WindowText,
_Classname: string;
begin
SetLength (_classname, 255);
SetLength (_windowtext, 255);
SetLength (_classname,GetClassName (_handle, pchar(_classname), length(_classname)));
SetLength (_windowtext,GetWindowText (_handle, pchar(_windowtext), length(_windowtext)));
{обязательно обрезаем лишнее!}
Result.ClassName := _classname;
Result.WindowText := _windowtext;
end;
// callback функция для анализа child-окон
// wininfo указывает на структуру TWinInfo с данными для сравнения
function MyChildWinCallback (_handle: hwnd;wininfo: pointer): bool;stdcall;
var w: TWinInfo;
begin
Result := True;
w := GetWinInfo (_handle);
if (w.ClassName=Twininfo(wininfo^).ClassName) and
(w.WindowText=TWininfo(wininfo^).WindowText) then
begin
// ура! прекращаем поиск и заполняем результат поиска
result := false;
TWinInfo(WinInfo^).WinHandle := _handle;
end;
end;
// callback функция для анализа top-окон
// wininfo указывает на структуру TWinInfo с данными для сравнения
function MyWinCallback (_handle: hwnd; wininfo: pointer): bool;stdcall;
var w: TWinInfo;
begin
Result := True;
{может, мы ищем окно верхнего уровня}
w := GetWinInfo (_handle);
if (w.ClassName=TWinInfo(wininfo^).ClassName) and
(w.WindowText=TWinInfo(wininfo^).WindowText) then
begin
// нашли, заполняем результат и выходим
result := false;
TWInInfo(WinInfo^).WinHandle := _handle; //тут-заголовок найденного окна
Exit // уходим, чтобы не искать в дочерних
end;
// продолжаем поиск среди дочерних окошек
EnumChildWindows (_handle, @MyChildWinCallBack, Integer(WinInfo));
end;
function FindAnyWindow (ClassName, WindowText: pchar): hwnd;
Var WinInfo: TWinInfo; // структура, в которой будут хранится
// сравниваемые данные
begin
WinInfo.ClassName := ClassName;
WinInfo.WindowText := WindowText;
WinInfo.WinHandle := 0;
EnumWindows (@MyWinCallBack,Integer(@WinInfo));
Result := WinInfo.WinHandle
end;
end.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c