Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 148

Раздел: Delphi » Прочее
/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
В инете нашёл следующий код (приложение) и решил применить его с некоторыми доработками на работе,на то есть причины.В доработке я хотел бы добавить этот код в автозапуск ,но вместо рабочего стола
использовать его при запуске "Паука" или "Косынки"в ихних окнах.Помогите!

Приложение:
  1. program project1;
  2. uses Windows,
  3.  
  4. var
  5.  
  6. begin
  7.  
  8.  
  9. while true do
  10. begin
  11. Yield;
  12.  
  13. end;
  14. end.


GAZ Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

Feniks (статус: Бакалавр), 28 ноября 2007, 19:02 [#1]:

Лучше уж сразу прибивать такие окна/процессы...
GAZ

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

GAZ (статус: Посетитель), 29 ноября 2007, 06:38 [#4]:

А не подскажете как вообще определяется ClassName: Имя класса окна?
Feniks

Feniks (статус: Бакалавр), 29 ноября 2007, 10:01 [#5]:

Поищите в Хелпе Делфи еще функции FindWindowEx и EnumWindow.
А для определения дочернего окна есть специальный флаг у окон. Вот только я не могу вспомнить какой именно. И тогда при переборе по циклу всех окон можно определять какое из них дочернее, активное, родное и т.д.
Feniks

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

Feniks (статус: Бакалавр), 29 ноября 2007, 10:26 [#7]:

А по поводу ClassName смотрите Пример №1,
Пример №2, Пример №3 может они Вам чем-то и помогут.
Feniks

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;

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:00
Выполнено за 0.03 сек.