Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Управление чужим окном на более сложном уровне   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
1-1094634100
Sashkosoft
2004-09-08 13:01
2004.09.26
Создать файл наподобии архивного


3-1093958231
Manfred8
2004-08-31 17:17
2004.09.26
Проблемы с клиентом приложений


4-1092327296
Константинов
2004-08-12 20:14
2004.09.26
Как вкл/выкл автоповтор символов при удержании клавиши клавиатуры


3-1093598932
=Far_Away=
2004-08-27 13:28
2004.09.26
Unicode+ADO+Mysql


1-1095060786
VladimirES
2004-09-13 11:33
2004.09.26
Создать файл Excel я не используя ExcelApplication.