Отримати handle вікна за неповним імені

отримати handle вікна за неповним імені

тобто задача така що треба знайти вікно і отримати його handle, але вікно може змінюватися.
наприклад знайти вікно Delphi 7 на пряму не вийти тому якщо наприклад відкритий проект. назва вікна буде виглядати як Delphi 7- Project1.dpr. Як можна знайти за випадковим збігом. Нарив код який робить це. Але на практиці, функція повертає handle = 0 тобто вікно не знайдено. в кінці відпрацьовує "Window Not Found!"
ось Код

// -----------------
function EnumWindowsProc (hWindow. hWnd; lParam. LongInt). Bool stdcall; ; export;
var
# XA0; lpBuffer: PChar;
# XA0; WindowCaptionFound: bool;
# XA0; ClassNameFound: bool;
begin
# XA0; GetMem (lpBuffer, 255);
# XA0; Result: = True;
# XA0; WindowCaptionFound: = False;
# XA0; ClassNameFound: = False;

# XA0; try
# XA0; # XA0; if GetWindowText (hWindow, lpBuffer, 255)> 0 then
# XA0; # XA0; # XA0; if Pos (PFindWindowStruct (lParam) .Caption, StrPas (lpBuffer))> 0 then
# XA0; # XA0; # XA0; # XA0; WindowCaptionFound: = true;

# XA0; # XA0; if PFindWindowStruct (lParam) .ClassName = "" then
# XA0; # XA0; # XA0; ClassNameFound: = True
# XA0; # XA0; else
# XA0; # XA0; if GetClassName (hWindow, lpBuffer, 255)> 0 then
# XA0; # XA0; # XA0; if Pos (PFindWindowStruct (lParam) .ClassName, StrPas (lpBuffer))> 0 then
# XA0; # XA0; # XA0; # XA0; ClassNameFound: = True;

# XA0; # XA0; if (WindowCaptionFound and ClassNameFound) then
# XA0; # XA0; begin
# XA0; # XA0; # XA0; PFindWindowStruct (lParam) .WindowHandle: = hWindow;
# XA0; # XA0; # XA0; Result: = False;
# XA0; # XA0; end;

# XA0; finally
# XA0; # XA0; FreeMem (lpBuffer, sizeof (lpBuffer ^));
# XA0; end;
end;

function FindAWindow (Caption. string; ClassName. string). THandle;
var
# XA0; WindowInfo. TFindWindowStruct;
begin
# XA0; with WindowInfo do begin
# XA0; # XA0; Caption: = Caption;
# XA0; # XA0; ClassName: = ClassName;
# XA0; # XA0; WindowHandle: = 0;
# XA0; # XA0; EnumWindows (@EnumWindowsProc, LongInt (@WindowInfo));
# XA0; # XA0; FindAWindow: = WindowHandle;
# XA0; end;
end;
// -----------------

procedure TForm1.close_start (Sender: TObject);
var
# XA0; # XA0; h: THANDLE;
# XA0; # XA0; TheWindowHandle. THandle;
begin
TheWindowHandle: = FindAWindow ( "Delphi 7 -", "");
# XA0; if TheWindowHandle = 0 then
# XA0; # XA0; ShowMessage ( "Window Not Found!")
# XA0; else
# XA0; # XA0; BringWindowToTop (TheWindowHandle);

Чи не занадто багато тобі захотілося?


> Чи не занадто багато тобі захотілося?

Флейм..по суті нічого.

По суті бажаєте?

Будьте ласкаві зробити запит до msdn.microsoft.com по ключ.фразе "EnumWindows".

Або не царська це справа?

Ось тепер по суті.
Добре, а вище описаний код чому не працюватиме?

EnumWindows врятує батька російської демократії. Подробиці в хелпе.

> Dimich1978 # XA0; (05.05.06 13:22)

У мене цей код працює.

procedure TForm1.Button1Click (Sender: TObject);
begin
ListBox1.Clear;
EnumWindows (@EnumProc, 0);
end;

Найпростіший спосіб на мій погляд в даній ситуації це шукати вікно по його класу.
Ім'я класу вікна найчастіше не залежить від його заголовка.
Або ж якщо неможливо шукати по класу то тоді бери список всіх вікон в системі,
потім бери окремо заголовок кожного вікна і порівнюй його з умовою.
наприклад:

function GetWndList: TStrings;
begin
// Беремо список всіх вікон і поміщаємо їх в строковий масив
end;

ListBox1.Items.Clear;
ListBox1.Items: = GetWndList;
for i: = 0 to ListBox1.Items.Count -1 do
# XA0; # XA0; # XA0; if pos ( "Delphi 7", ListBox1.Items.Strings [i]) = 1 then // Вікно знайшли виконуємо дії

Зробив в лоб. Тобто просто зберігаю в файлі вікна коториенадо закривати. Можна додавати і видаляти записи. Більш універсально получілось..можно закривати не тільки 1С-ие вікна, а практично будь-які. Хоча для інтересу хотілося б розібратися з цим питанням.

Пам'ять: 0.74 MB
Час: 0.065 c