Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1

Отправка сообщения другому окну с определенным интервалом

12.02.2012, 03:04. Показов 3971. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне надо отправлять нажатие клавиш с определенным интервалом другой программе.
Вот я отправляю нажатие клавиши F1 другому окну, но мне надо чтобы клавиша F1 нажималась допустим каждые 10 сек. Поначалу сделал циклом и делал Sleep(10000) но такой вариант неподходит. Я так понимаю тут надо както с таймером. Подскажите кто знает
C++
1
2
3
4
5
6
7
wnd=FindWindowEx(NULL,NULL,"окно",NULL);
  if(wnd>0)
    {
            SendMessage(wnd,WM_KEYDOWN,VK_F1,0);
             }
    else
          MessageBox(NULL,"Window not found","",MB_OK);
Добавлено через 12 минут
вот как я делал с Sleep
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
case butStart:
   wnd=FindWindowEx(NULL,NULL,"окно",NULL);
    if(wnd>0)
  {
     do
     {
    SendMessage(wnd,WM_KEYDOWN,VK_F1,0);
    Sleep(10000);
     }
           while(f!=false);
     }
     else
    MessageBox(NULL,"Window not found","",MB_OK);
break;
case butStop:
    f=false;
  break;
но после нажатия программы старт программа та отправляла нажатия клавиш другому окну а от сама походу зависла, кароче другую кнопту стоп нажать неполучается
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2012, 03:04
Ответы с готовыми решениями:

Отправка сообщения с интервалом времени
У меня с сайта отправляют письма. как сделать чтобы пользователь отправлял одно письмо, а следующие мог отправить через определенное время,...

Отправка сообщения главному окну (SendMessage) из оконной процедуры дочернего окна
При нажатии Энтера в дочернем окне управления hwndEditFKern, главное окно hwnd должно обработать нажатие Энтера, но почему то как я понимаю...

Отправка сообщения другому клиенту (собеседнику)
Никак не могу понять как сделать так, что бы сообщение отправлялось другим клиентам, или если это собеседник то одному. У меня отправляет...

21
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
12.02.2012, 03:28
Запускай цикл в отдельном потоке, тогда основной цикл обработки сообщений не зависнет.
0
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
12.02.2012, 03:42  [ТС]
Anton_Grey, несовсем понял о чем ты говориш, напиши как ето будет выглядеть
0
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
12.02.2012, 03:55
Выносишь цикл в функцию
C++
1
2
3
4
5
6
7
8
unsigned __stdcall ThreadFunc()
{
    do
    {
        SendMessage(wnd,WM_KEYDOWN,VK_F1,0);
        Sleep(10000);
    } while(f!=false);
}
и вот так

C++
1
2
3
4
5
6
7
8
9
case butStart:
   wnd=FindWindowEx(NULL,NULL,"окно",NULL);
    if(wnd>0)
  {
        _beginthread(ThreadFunc, 0, NULL);
  }
     else
        MessageBox(NULL,"Window not found","",MB_OK);
break;
0
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
12.02.2012, 04:06  [ТС]
Anton_Grey, _beginthread ето неопредел, я так понял ето
C++
1
hThread = CreateThread(NULL, 0, ThreadFunc(), NULL, NULL, NULL);
, вобще запутано и получается, может както через таймер проще будет сделать?
0
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
12.02.2012, 04:07
Тоже подойдет.
Я так понимаю сообщение должно отправляться всё время работы программы.
0
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
12.02.2012, 04:12  [ТС]
Anton_Grey, да но так не работает hThread = CreateThread(NULL, 0, ThreadFunc(), NULL, NULL, NULL). unsignet int несовместим с LPTHREAD_START_ROUTINE както так
Может я ошибаюсь но помойму изначально зависала программа потомучто сама функция Sleep останавливает программу, тут наверно всетаки таймер надо
0
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
12.02.2012, 04:28
Не работает или не компилируется? у меня все нормально.
1
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
12.02.2012, 04:47  [ТС]
Anton_Grey, все сделал, спасиб что подсказал как
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DWORD WINAPI ThreadFunc(LPVOID A)
{
      do
    {
        SendMessage(wnd,WM_KEYDOWN,VK_F1,0);
        Sleep(10000);
    } while(f!=false);
    return 0;
}
.........
case butStart:
wnd=FindWindowEx(NULL,NULL,"окно",NULL);
if(wnd>0)
    hThread = CreateThread(NULL, 0, ThreadFunc, NULL, NULL, NULL); 
else
MessageBox(NULL,"Window not found","",MB_OK);
break;
Добавлено через 18 минут
Anton_Grey, ето я так понял, чтобы нажимались несколько клавиш, мне для каждой клавиши надо создавать свой поток?
0
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
12.02.2012, 04:53
Да, это самый простой способ (ничего толковее не придумаю).
По ресурсам конечно немного накладно выходит, но я думаю не очень критично.
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
12.02.2012, 07:38
Цитата Сообщение от xdozorx Посмотреть сообщение
сама функция Sleep останавливает программу
Да, эта функция останавливает программу. Если требуется продолжать нормально с ней работать, то следует использовать таймер: запускаем его через SetTimer(), ловим WM_TIMER или используем TimerProc() - это дело вкуса почти, в конце программы удаляем KillTimer().
1
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
12.02.2012, 13:43  [ТС]
GrayWolf, немогбы показать как ето будет выглядеть с таймером? я просто с ним неочень дружу
0
 Аватар для Игорь с++
500 / 474 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
12.02.2012, 14:53
C++
1
2
3
4
5
6
case WM_CREATE:
SetTimer(hwnd,1,1000,NULL);
break;
case WM_TIMER:
//то что нужно сделать когда сработает таймер
break;
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
12.02.2012, 15:06
Что-то типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
   // тут, например, создаем главное окно с указателем handle
   ...
   // создаем таймер
   UINT uTimer = SetTimer(handle, NULL, 1000, NULL);
   ...
   // тут еще чего-то делаем
   ...
   // удаляем таймер
   KillTimer(uTimer);
}
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wp, LPARAM lp)
{
   switch(uMsg)
   {
      case WM_TIMER:
         // тут совершаем какие-то действия по таймеру
         break;
   }
}
0
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
12.02.2012, 16:37  [ТС]
Вот что делаю но нечего не работает
C++
1
2
3
4
5
6
7
  case WM_CREATE:
       window=FindWindowEx(NULL,NULL,"окно",NULL);
      SetTimer(hDlg,1, 5000, NULL);
break;
             case WM_TIMER:
                 SendMessage(window,WM_KEYDOWN,VK_F1,0);
                 break;
и как мне отправлять сообщения с разным интервалом ? наример в одном отправляю клавишу F1 с интервалом 10 сек, а в другом клавишу F2 с интервалом 5 сек
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
12.02.2012, 17:34
По-моему ответ очевиден - создать два таймера. Либо использовать какую-то переменную. Т.е. ты в обработчике события задаешь какую-то static переменную, проверяешь ее значение и, если оно удовлетворяет условию, то выполняешь какие-то действия; иначе просто изменяешь ее значение. Static используется для того, чтобы переменная сохраняла свое значение все время работы программы. Можно, конечно, использовать глобальную переменную для модуля, но это плохой тон программирования.
0
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
15.02.2012, 05:22  [ТС]
Вот пытаюсь сделать чтото типа автокликера. После компиляции жму старт, программа работает нормально, но после того как жму стоп, и заного жму старт, тут уже непонятно как работает. Я так подозреваю что нетак работает из за того что не освобождаю поток или чета в етом роде.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
case butStart:
            window=FindWindowEx(NULL,NULL,"my_okno",NULL);
            if(window>0)
            {
                if(IsDlgButtonChecked(hDlg,IDC_CHECK1))
                {
                  time_f1=GetDlgItemInt(hDlg,IDC_EDIT1,NULL,true);
                  CreateThread(NULL, 0, func_pressF1, NULL, NULL, NULL);
                }
                if(IsDlgButtonChecked(hDlg,IDC_CHECK2))
                {
                  time_f2=GetDlgItemInt(hDlg,IDC_EDIT2,NULL,true);
                  CreateThread(NULL, 0, func_pressF2, NULL, NULL, NULL);
                }
                                            .......
                //так до F12
            }
            else
                MessageBox(hDlg,"Window not found","Error",MB_OK|MB_ICONERROR);
        break;
 
        case butStop:
            f=false;
            break;
C++
1
2
3
4
5
6
7
8
9
10
DWORD WINAPI func_pressF1(LPVOID)
{
    do
    {
        SendMessage(window,WM_KEYDOWN,VK_F1,0);
        Sleep(time_f1);
    } 
    while(f!=false);
    return 0;
}
Подскажите в чем может быть дело
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
15.02.2012, 05:47
Не вижу ExitThread() в коде кнопки "Стоп"
0
15 / 16 / 1
Регистрация: 13.12.2009
Сообщений: 138
Записей в блоге: 1
15.02.2012, 17:08  [ТС]
GrayWolf, надо чтто типа етого сделать?
C++
1
HANDLE hTread1,hTread2;
C++
1
2
hTread1=CreateThread(NULL, 0, func_pressF1, NULL, NULL, NULL);
hTread2=CreateThread(NULL, 0, func_pressF2, NULL, NULL, NULL);
C++
1
2
ExitThread(hTread1)
ExitThread(hTread2)
0
Исследователь
 Аватар для GrayWolf
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
15.02.2012, 20:04
xdozorx, насколько я понял из описания CreateThread(), да.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2012, 20:04
Помогаю со студенческими работами здесь

Отправка сообщения определенным сокетам
Как можно отправлять сообщения не всем, а некоторым сокетам? Чтоб отправить всем, я делаю так: listSocket =...

каждые 3 секунды таймер обращается к другому окну
Дело такое. Есть форма, кнопка и таймер. мне надо, что бы каждые 3 секунды, таймер обращался к другому окну(допустим к проигрывателю,...

Присоединение границы окна программы к другому окну
Здравствуйте форумчане. Всех мужского пола с праздников. Подскажите, как сделать, чтобы было присоединение границы окна программы к другому...

Отчет с определенным интервалом дат
Задался вопросом как забахать отчет, даты начала и конца которого определяются вручную пользователем.

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru