![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с функциями 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; Приведите нормальный и полный текст.