Главная страница
    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.032 c
14-1094242665
Ломброзо
2004-09-04 00:17
2004.09.26
Гуманное перевоспитание!


1-1094873567
AZ
2004-09-11 07:32
2004.09.26
IDE – навигация по коду


14-1094044850
pasha_golub
2004-09-01 17:20
2004.09.26
Музыка хорошего настроения


3-1093660094
mr.dfox
2004-08-28 06:28
2004.09.26
Ввод времени в DBGrid.


14-1094378919
Voland
2004-09-05 14:08
2004.09.26
как отключить explorer в винХР





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