Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2010, 13:33   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию C++ Builder KillTimer()

Доброго времени суток уважаемые experts :D
Возникла проблема с уничтожением таймера, неизвестно по каким причинам он напрочь отказывается умирать... "Или может я не правильно что-то делаю или эт глюки в среде, вообщем без понятий но по идее код правильный".

Здесь по заголовку окна, я включаю Timer и начинаю нервно click'ать.
Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	HWND hWnd;
	hWnd = FindWindow("[WINDOWNAME]", NULL);
	SetTimer(hWnd, IDT_TIMER1, 20, (TIMERPROC)NULL);
	SendMessageA(hWnd, WM_LBUTTONDOWN, 0, 0);
	SendMessageA(hWnd, WM_LBUTTONUP, 0, 0);
}
Здесь, при попытке его уничтожения он все равно продолжает нервно click'ать...
Код:
void __fastcall TForm2::Button3Click(TObject *Sender)
{
	HWND hWnd;
	hWnd = FindWindow("[WINDOWNAME]", NULL);
	KillTimer(hWnd, IDT_TIMER1);
}
coNsept вне форума Ответить с цитированием
Старый 27.08.2010, 14:07   #2
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Насколько я помню, то SetTimer возвращает идентификатор таймера, а не забивается вручную.

Потому предложил бы попробовать

Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	HWND hWnd;
	hWnd = FindWindow("[WINDOWNAME]", NULL);
	IDT_TIMER1=SetTimer(hWnd, 0, 20, (TIMERPROC)NULL);
	SendMessageA(hWnd, WM_LBUTTONDOWN, 0, 0);
	SendMessageA(hWnd, WM_LBUTTONUP, 0, 0);
}
Соответственно объявив IDT_TIMER1 где-то, чтоб в зоне видимости была для обеих.
dexterua вне форума Ответить с цитированием
Старый 27.08.2010, 14:49   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Безрезультатно, таймер не останавливается.

p.s. Его можно остановить только таким методом, полностью выключив таймер: Timer1->Enabled = false; Ну а мне желательно чтобы KillTimer остановил!

Последний раз редактировалось coNsept; 27.08.2010 в 17:18.
coNsept вне форума Ответить с цитированием
Старый 27.08.2010, 15:07   #4
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

идентификатор таймера задается в ручную. Может вы не храните на него глобальную ссылку или она теряет свое значение? Возможно, вы ошиблись в каком-то другом месте
sashonk вне форума Ответить с цитированием
Старый 27.08.2010, 15:16   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Объявил int IDT_TIMER1 = 1; глобально, по кнопкам раскидал SetTimer и KillTimer, я собственно уже приводил пример. Первоначально я устанавливаю компонент Timer как disabled, далее уже на кнопки->Button1 включаю. А вариант уважаемого dexterua не работает.

Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	HWND hWnd; hWnd = FindWindow("[WINDOWNAME]", NULL);
        Timer1->Enabled = true;
	SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC)NULL);
	SendMessageA(hWnd, WM_LBUTTONDOWN, 0, 0);
	SendMessageA(hWnd, WM_LBUTTONUP, 0, 0);
}
Код:
void __fastcall TForm2::Button3Click(TObject *Sender)
{
	HWND hWnd;
	hWnd = FindWindow("[WINDOWNAME]", NULL);
	KillTimer(hWnd, IDT_TIMER1);
}

Последний раз редактировалось coNsept; 27.08.2010 в 15:20.
coNsept вне форума Ответить с цитированием
Старый 27.08.2010, 16:30   #6
dexterua
Пользователь
 
Регистрация: 16.11.2009
Сообщений: 24
По умолчанию

Да был не прав, забыл, что возвращается идентификатор только, когда первый параметр NULL.
А так по тексту - если не сложно выложите весь код, пожалуйста.
Потому как синтаксис вроде верен, возможно ошибка немного в другом месте.
А также было бы интересно узнать какое значение возвращает KillTimer.
dexterua вне форума Ответить с цитированием
Старый 27.08.2010, 17:37   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Это весь код собственно, одна форма и две кнопки. Запуск эмуляции нажатия левой кнопки мыши по таймеру и соответственно остановка эмуляции.

# Всем спасибо кто помогал, проблему решил
coNsept вне форума Ответить с цитированием
Старый 29.08.2010, 21:56   #8
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

А зачем такое, как мы все поняли ты работаеш под C++ Builder. Не изобретай велосипед перенеси на форму таймер со странице Win32.

тогда твой код можно модефецировать, но задав параметры пересчета таймера.
Свойства таймера
Timer1 ->Enabled = true/false доступность таймера
Timer1 ->Interval = 20;//интервал в милисекундах
Если Enabled = false или Interval = 0 таймер должен остановиться
попробуй оба свойства изменять

Да и по достижении тайм аута возникает событие OnTimer попробуйте использовать его.

и пожалуста прокоментируйте
Код:
SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC)NULL);
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 30.08.2010, 05:19   #9
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
А зачем такое, как мы все поняли ты работаеш под C++ Builder. Не изобретай велосипед перенеси на форму таймер со странице Win32.
Немного не понял с изобретением велосипеда, вроде нормально все.
OnTimer у меня стоит на Button1

Код:
void __fastcall TForm2::Button1Click(TObject *Sender)
{
	HWND hWnd;
	UnicodeString String1 = Edit1->Text;
	Edit1->Text = String1;
	UnicodeString String2 = Edit1->Text;

	hWnd = FindWindow(String2.t_str(), NULL);

	Timer1->Enabled = TRUE;

	/*
	+ ComboxBox будет задавать интервал времени
	*/

	SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC)NULL);

	if (Button5->Enabled == FALSE)
	{ SendMessageA(hWnd, WM_LBUTTONDOWN, 0, 0); SendMessageA(hWnd, WM_LBUTTONUP, 0, 0); }
	if (Button6->Enabled == FALSE)
	{ SendMessageA(hWnd, WM_RBUTTONDOWN, 0, 0); SendMessageA(hWnd, WM_RBUTTONUP, 0, 0); }
}

Последний раз редактировалось coNsept; 30.08.2010 в 05:55.
coNsept вне форума Ответить с цитированием
Старый 30.08.2010, 22:20   #10
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Ну согласен
А зачем ты пишиш
Код:
SetTimer(hWnd, IDT_TIMER1, 1000, (TIMERPROC)NULL);
ЗАЧЕМ тебе еше раз создавать таймер, насколько я понимаю он у тебя уже есть. Нельзя ли ввести пересчет для имеющегося проше...
Код:
Timer1 ->Interval = 1000;
А в обработчик события OnTimer, происходящее по достижения таймера 0, написать код..
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БД в С++ Builder LingVist C++ Builder 3 21.12.2009 13:37
C++ Builder Eugene_Rublev Помощь студентам 5 29.09.2009 17:50
Перенести код из C++ Builder 5 в C++ Builder 2009 Kreadlling C++ Builder 2 13.09.2009 14:00
SetTimer, KillTimer NeiL Win Api 5 05.03.2008 07:37