Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с функциями EnumWindows и GetWindowText


GrieVeR-13 ©   (2008-07-08 21:59:00) 

function cb(h:hwnd;l:longint):boolean;stdcall;
var s:PCHAR;
begin
result:=true;
 GetWindowText(h,s,8);
if s = '[ #] Lin' then begin
h2:=h;
inc(c);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 EnumWindows(@cb,0);
<...>
end;

Задача: нужно найти все окна с именем '[ #] Lienage [ #]', и запомнить дескрипторы, чтобы в последствии им можно было посылать сообщения через PostMessage(...).
Проблема: без строчки h2[c]:=h; работает, но считает количество окон очень криво, иногда находит больше чем есть. А с ней вообще вылетает.. Почему?.. Целый день бьюсь над этой проблемой, заранее спасибо...


GrieVeR-13   (2008-07-09 16:33:00) [1]

Слышал. Что верно то верно..
приду домой исправлю.
Кто-то спрашивал, зачем я задаю вопросы на форуме? Так вот ради таких ответов и задаю.
Всем, кто мне помог, спасибо. До свидания.


Anatoly Podgoretsky   (2008-07-09 16:20:00) [2]

> GrieVeR-13  (09.07.2008 16:14:18)  [18]

Про законы Паркинсона слышал. Не рушимы. Надо не только качать, но и смотреть справку и для АПИ еще и определения в Windows.pas, а то Интернет это такая помойка, всем помойкам помойка. А генофонд не рушим.


GrieVeR-13   (2008-07-09 16:14:00) [3]

Если так, то тогда в этом моЯ ошибка - в исходнике, что я скачал из инета был булеан.
Но день активных тестов, показал что никаких неожиданностей не возникло. И боты работали исправно.


Anatoly Podgoretsky   (2008-07-09 15:54:00) [4]


> Как писать, бул или булеан, решаю я. На мой взгляд аккуратнее
> булеан.

Не аккуратно и главное большая ошибка, они даже по размеру не равны, со всеми вытекающими из этого последствиями. Грозит непридвиденными последствиями. Поскольку для BOOLEAN определен байт с двумя значениями, а для BOOL (то чего ожидает виндоус), который 4 байта и весь диапазон значений.


GrieVeR-13   (2008-07-09 15:42:00) [5]

function cb(h:hwnd;l:longint):boolean;stdcall;
var s:array [0..256] of char;
begin
result:=true;
GetWindowText(h,s,255);
if strpas(s) = '[ #] Lineage II [ #]' then begin
PostMessage(h,WM_CHAR,ord('a'),0);
end;
end;
Рабочий вариант. И вуаля. Во всех заданных окнах магическим образом появляется "а".
Весь код я писал без Delphi под рукой, с телефона и по памяти. За опечатки не пинайте.


{RASkov}   (2008-07-09 15:33:00) [6]

> [14] GrieVeR-13 ©   (09.07.08 15:04)
> Как писать, бул или булеан, решаю я.

Вот скажи честно, зачем ты тогда вообще на форуме вопросы задаешь? ...если сам все решаешь.


GrieVeR-13   (2008-07-09 15:04:00) [7]

Как писать, бул или булеан, решаю я. На мой взгляд аккуратнее булеан.


MBo   (2008-07-09 13:44:00) [8]

>Чем Вам мой boolean не понравился?
BOOL будет аккуратнее


Leonid Troyanovsky   (2008-07-09 13:41:00) [9]


> GrieVeR-13 ©   (09.07.08 13:31) [11]

> Чем Вам мой boolean не понравился? Он тут по делу стоит.

http://msdn.microsoft.com/en-us/library/ms633498(VS.85).aspx

> И без иных ошибок.

if s = '[ #] Lin' then begin
h2:=h;
inc(c);
end;

- Сплошная ошибка.

Я ж просил не флудить, а привести решение.

--
Regards, LVT.


GrieVeR-13   (2008-07-09 13:31:00) [10]


> S надо было задать как  var s:array [0..256] of char; И
> всё сразу стало работать.

И без иных ошибок.
Это и есть решение.
Чем Вам мой boolean не понравился? Он тут по делу стоит.


Leonid Troyanovsky   (2008-07-09 13:01:00) [11]


> GrieVeR-13 ©   (09.07.08 12:22) [9]

> Закройте тему. Или на сайте эта функция отсутствует?

Зачем? Лучше учиться на чужих ошибках.

> "8" потому что мне так понравилось

Boolean тоже понравилось?

> свою проблему я уже решил.

Вот и доложи решение и тема, считай, будет закрыта.
Хотя, сомнительно, что удасться сделать это без иных ошибок.

--
Regards, LVT.


GrieVeR-13   (2008-07-09 12:22:00) [12]

Я никого не заставлял принудительно, я просто попросил - может кто нашел бы ошибку, и свою проблему я уже решил.
"8" потому что мне так понравилось, потом вообще 255 поставил.
'[ #] Lin' это имя окна. А "некоторые", потому что не все. Но их число стремительно увеличивается.
И пора бы уже прекратить решать "вопросы личного характера".
Закройте тему. Или на сайте эта функция отсутствует?


GrayFace   (2008-07-09 10:44:00) [13]

А почему именно 8? И почему "некоторые" в ковычках?


{RASkov}   (2008-07-09 10:41:00) [14]

> [5] GrieVeR-13 ©   (09.07.08 03:24)
> Закройте, пожалуйста, тему, чтобы "некоторые" личности,
> которые и слова не сказали по теме, не разводили флуд...

Кусок "кода" приведенного тобой - "не читабельный". Отсюда и флуд.... А что ты хотел?
Или ты хочешь стукнуть кулаком по столу и тебе все кинулись решать твои проблемы?


Германн   (2008-07-09 03:38:00) [15]


> GrieVeR-13 ©   (09.07.08 03:24) [5]
>
> Закройте, пожалуйста, тему, чтобы "некоторые" личности,
> которые и слова не сказали по теме, не разводили флуд...
>
> А palva всё равно спасибо, из-за него я ошибку и нашел.
>

Пойди с ним в поход. Туристический. Там он тебе и объяснит всё на практике!
:)


GrieVeR-13   (2008-07-09 03:24:00) [16]

Закройте, пожалуйста, тему, чтобы "некоторые" личности, которые и слова не сказали по теме, не разводили флуд...
А palvaвсё равно спасибо, из-за него я ошибку и нашел.


Германн   (2008-07-09 02:09:00) [17]


> И попытки опустить меня намеками о моей не способности к
> программированию вовсе не желательны...Особенно, если сами
> не понимаете в чем причина ошибки.
>

В игнор!


GrieVeR-13   (2008-07-09 02:01:00) [18]

palvaспасибо, я сам разобрался в чем дело.
S надо было задать как  var s:array [0..256] of char; И всё сразу стало работать.
И попытки опустить меня намеками о моей не способности к программированию вовсе не желательны...Особенно, если сами не понимаете в чем причина ошибки.


SergeyIT   (2008-07-09 00:18:00) [19]


> f s = '[ #] Lin' then

И это непонятно что проверяет...


palva   (2008-07-09 00:04:00) [20]

У вас очень плохой текст. Если вы и мыслите в том же стиле, то вам лучше не заниматься программированием.
У вас не присвоено значение переменной s. Поскольку там мусор, то функция GetWindowText вообще должна вылететь или испортить где-нибудь память. Где у вас строчка h2[c]:=h; Приведите нормальный и полный текст.


Наверх

Титульная страница Поиск, карта сайта Написать письмо