| 
| 
 | Вопрос # 1 148/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!В инете нашёл следующий код (приложение) и решил применить его с некоторыми доработками на работе,на то есть причины.В доработке я хотел бы  добавить этот код в автозапуск ,но вместо рабочего стола
 использовать его при запуске "Паука" или "Косынки"в ихних окнах.Помогите!
 
|  |   Вопрос задал: GAZ (статус: Посетитель)Вопрос отправлен: 28 ноября 2007, 18:22
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, GAZ!Есть такая строка
 desk.handle:=GetDC(0);
 0 - это хендл рабочего стола. сюда надо подставить нужный хендл. для поиска используем функцию findWindow, которая по имени окна и/или классу окна может выдать хендл.
 для косынки, например, надо юзать так
 desk.handle:=GetDC(FindWindow('Косынка','Solitaire'));
 если для окна имя или класс неизвестен, то можно написать nil.
 
 Но игра тоже обновляет своё окно, и нет гарантии, что нарисованная вами точка не будет стёрта.
 
 П.С. Играть на работе в игры плохо.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 28 ноября 2007, 18:31
 
 |  
 Мини-форум вопросаВсего сообщений: 8; последнее сообщение — 30 ноября 2007, 17:17; участников в обсуждении: 3. 
|   | Feniks (статус: Бакалавр), 28 ноября 2007, 19:02 [#1]:Лучше уж сразу прибивать такие окна/процессы... |  
|   | GAZ (статус: Посетитель), 28 ноября 2007, 19:07 [#2]:Вопрос Вадим К: 
 Описание:
 function FindWindow(ClassName, WindowName: PChar): HWnd;
 Находит pодительское окно веpхнего уpовня с совпадающими     ClassName и WindowName. Не осуществляет поиск дочеpних окон.
 Паpаметpы:
 ClassName: Имя класса окна (заканчивающееся пустым символом, nil - если все классы).
 WindowName: Текстовый заголовок окна или 0, если все окна.
 
 Так ли я понял:
 
 'Косынка'- Имя класса окна ???
 'Solitaire'- а это разве текстовый заголовок окна,там вроде'Косынка'и написано или я не то смотрю
 |  
|   | Вадим К (статус: Академик), 28 ноября 2007, 20:19 [#3]:Я перепутал параметры местами   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | GAZ (статус: Посетитель), 29 ноября 2007, 06:38 [#4]:А не подскажете как вообще определяется ClassName: Имя класса окна? |  
|   | Feniks (статус: Бакалавр), 29 ноября 2007, 10:01 [#5]:Поищите в Хелпе Делфи еще функции FindWindowEx и EnumWindow. А для определения дочернего окна есть специальный флаг у окон. Вот только я не могу вспомнить какой именно. И тогда при переборе по циклу всех окон можно определять какое из них дочернее, активное, родное и т.д.
 |  
|   | Feniks (статус: Бакалавр), 29 ноября 2007, 10:15 [#6]:Я нашел пример "Как определить какие приложения уже запущены?" 
 procedure TForm1.Button1Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
ListBox1.Clear;
Wnd := GetWindow(Handle, gw_HWndFirst);
WHILE Wnd <> 0 DO 
BEGIN {Не показываем:}
IF (Wnd <> Application.Handle) AND {-Собственное окно}
IsWindowVisible(Wnd) AND {-Невидимые окна}
(GetWindow(Wnd, gw_Owner) = 0) AND {-Дочернии окна}
(GetWindowText(Wnd, buff, sizeof(buff)) <> 0) {-Окна без заголовков}
THEN BEGIN
GetWindowText(Wnd, buff, sizeof(buff));
ListBox1.Items.Add(StrPas(buff));
END;
Wnd := GetWindow(Wnd, gw_hWndNext);
END;
ListBox1.ItemIndex := 0;
end; |  
|   | Feniks (статус: Бакалавр), 30 ноября 2007, 17:17 [#8]:Предыдущие три ссылки мои оказались битыми. Исправляю эту ошибку. Пример №1 - Как найти окно по неполному названию?
 Пример №2 - Узнать класс формы.
 Пример №1.
 
 type
PFindWindowStruct = ^TFindWindowStruct;
TFindWindowStruct = record
   Caption: string;
   ClassName: string;
   WindowHandle: THandle;
end;
 
function EnumWindowsProc(hWindow: hWnd; lParam: LongInt): Bool; stdcall;
var
lpBuffer: PChar;
WindowCaptionFound: bool;
ClassNameFound: bool;
begin
GetMem(lpBuffer, 255);
Result := True;
WindowCaptionFound := False;
ClassNameFound := False;
try
   if GetWindowText(hWindow, lpBuffer, 255) > 0 then
     if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0 then WindowCaptionFound := true;
   if PFindWindowStruct(lParam).ClassName = '' then
     ClassNameFound := True
   else if GetClassName(hWindow, lpBuffer, 255) > 0 then
     if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then ClassNameFound := True;
   if (WindowCaptionFound and ClassNameFound) then
     begin
       PFindWindowStruct(lParam).WindowHandle := hWindow;
       Result := False;
     end;
finally
   FreeMem(lpBuffer, sizeof(lpBuffer^));
end;
end;
 
function FindAWindow(Caption: string; ClassName: string): THandle;
var WindowInfo: TFindWindowStruct;
begin
WindowInfo.Caption := Caption;
WindowInfo.ClassName := ClassName;
WindowInfo.WindowHandle := 0;
EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
FindAWindow := WindowInfo.WindowHandle;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var TheWindowHandle: THandle;
begin
TheWindowHandle := FindAWindow('Opera', '');
if TheWindowHandle <> 0 then
   begin
     Showwindow(TheWindowHandle, sw_restore);
     BringWindowToTop(TheWindowHandle);
   end
else
   ShowMessage('Window Not Found!');
end;Пример №2.
 
 type 
  PFieldClassTable = ^TFieldClassTable; 
  TFieldClassTable = packed record 
    Count: Smallint; 
    Classes: array[0..8191] of ^TPersistentClass; 
  end; 
 
function GetFieldClassTable(AClass: TClass): PFieldClassTable; assembler; 
asm 
        MOV     EAX,[EAX].vmtFieldTable 
        OR      EAX,EAX 
        JE      @@1 
        MOV     EAX,[EAX+2].Integer 
@@1: 
end; 
 
procedure TForm1.Button1Click(Sender: TObject); 
  procedure Display( const S: String ); 
  begin 
    memo1.lines.add( S ); 
  end; 
var 
  pFCT: PFieldClassTable; 
  aClass: TClass; 
  i: SmallInt; 
begin 
  memo1.clear; 
  aClass:= Classtype; 
  While aClass <> TPersistent Do Begin 
    Display('Registered classes for class '+aClass.Classname ); 
    pFCT := GetFieldClasstable( aClass ); 
    If not Assigned( pFCT ) Then 
      Display('  No classes registered') 
    Else Begin 
      Display( format('  %d classes registered', [pFCT^.Count])); 
      for i:= 0 to pFCT^.Count -1 do 
        Display( '  '+pFCT^.Classes[i]^.ClassName ); 
    End; 
    aClass := aClass.ClassParent; 
  End 
end; |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |