|
Вопрос # 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;
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|