Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-1090447381
Skyhawk
2004-07-22 02:03
2004.09.26
Как зайти в систему на удаленном компьютере


3-1093668134
Rost
2004-08-28 08:42
2004.09.26
работа с access


1-1094620803
StarCon
2004-09-08 09:20
2004.09.26
порядковый номер строки в дб гриде


3-1093634976
VflowerW
2004-08-27 23:29
2004.09.26
Помогите пожалуйста разобраться с TreeView


3-1093929473
Jey
2004-08-31 09:17
2004.09.26
Группировка в отчете





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский