Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
1

HWND и отправка им сообщений.

13.02.2012, 15:45. Показов 2249. Ответов 16
Метки нет (Все метки)

Здравствуйте, я начал изучать язык C++. А также начал обучение для работы с C++ Borland 6. Неддавно покопался в нете и почитал о HWND. Решил попробовать - всё получается на всех программах кроме одной. Проверял я с помощью Spy++ окну приложения шлются сообщения, которые я планировал. Но само приложение на них не реагирует. Оно реагирует только если я сам ту кнопку нажму у себя на клавиатуре.
Вот код:

C++
1
2
3
4
5
6
7
8
9
HWND wnd, hwnd;
   wnd = FindWindow("Nkrtforest","Last Call");
  hwnd = FindWindowEx(wnd, 0, "TConversationForm", 0);
     if(wnd>0)
  {     PostMessage(wnd,WM_KEYDOWN,VK_F1,0);
        Sleep(1000);
         }
     else
        MessageBox(NULL,"Window not found","",MB_OK);
а ты кнопку отпускаешь?

PostMessage(hwnd,WM_KEYDOWN,VK_F1,0);
PostMessage(hwnd,WM_KEYUP,VK_F1,0);
Пробовал - тот же эффект.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2012, 15:45
Ответы с готовыми решениями:

Для чего служит первый параметр (HWND hWnd) в функции WndProc?
// функция обработки сообщений LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM...

Окно на WinAPI, параметр функции WndProc (HWND hWnd,.)
Пытаюсь понять какое значение хранит первый параметр HWND hWnd в функции WndProc. В Windows в...

Почему переменная HWND hwnd объявлена дважды?
Один раз в функции WinMain: int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,...

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

16
LK
Заблокирован
13.02.2012, 16:04 2
Кто ж знает, при чем тут какая-то кнопка ...
0
59 / 56 / 8
Регистрация: 22.07.2011
Сообщений: 436
13.02.2012, 17:48 3
в lParam нужно устанавливать некоторые дополнительные параметры. Например скэн - код

Добавлено через 7 минут
Попробуйте так:
C++
1
2
PostMessage(hwnd, WM_KEYDOWN, VK_F12, MapVirtualKey(VK_F12, 0) << 16 | 1);
 PostMessage(hwnd, WM_KEYUP, VK_F12, MapVirtualKey(VK_F12, 0) << 16 | 1 | 1 << 30 | 1 << 31);
1
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 17:02  [ТС] 4
Попробуйте так:
спс всё получилось!!!
Теперь пробую сделать так, чтобы эта клавишу нажималась так каждую секунду. Вот что получил:
C++
1
2
3
4
5
6
7
8
for(;wnd>0;)
  {
     PostMessage(hwnd, WM_KEYDOWN, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1);
    PostMessage(hwnd, WM_KEYUP, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1 | 1 << 30 | 1 << 31);
PostMessage(hwnd, WM_KEYDOWN, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1);
PostMessage(hwnd, WM_KEYUP, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1 | 1 << 30 | 1 << 31);
   Sleep(1000);
}
не нравится то, что программа тормозит и хоть кнопка нажимается, на саму прогу воздействовать уже нельзя. Как сделать чтобы прога не умирала?
0
LK
Заблокирован
14.02.2012, 17:06 5
Не использовать цикл с непонятным телом и Sleep(1000);, а использовать TTimer и Application->ProcessMessage();, если будет зависать.
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 17:28  [ТС] 6
а использовать TTimer и Application->ProcessMessage();, если будет зависать.
Пробовал TTimer - зависало.
Можете привести пример программного кода, а то у меня не получается?
0
LK
Заблокирован
14.02.2012, 17:36 7
Кидаете на форму компонент Timer, задаете ему интервал 1000, делаете обработчик OnTimer, вставляете туда свой код без слипа
C++
1
2
3
4
PostMessage(hwnd, WM_KEYDOWN, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1);
PostMessage(hwnd, WM_KEYUP, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1 | 1 << 30 | 1 << 31);
PostMessage(hwnd, WM_KEYDOWN, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1);
PostMessage(hwnd, WM_KEYUP, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1 | 1 << 30 | 1 << 31);
, суете туды для страховки
C++
1
Application->ProcessMessage()
, делаете, при желании, две кнопки, в обрабчики которых всталяет
C++
1
Timer->Enabled = true;
и
C++
1
Timer->Enabled = не true;
, смотрите, что получилось. А вы как делали ?
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 18:03  [ТС] 8
А вы как делали ?
Я делал не так - то есть все 4 функции были в кнопке а не в таймере
сейчас попробовал сделать как ты сказал:
1. Добавил таймер.
2. Прописал в нём:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Interval = 1000;
HWND wnd, hwnd;
   wnd = FindWindow("Nksp", 0);
  hwnd = FindWindowEx(wnd, 0, "ViewPort Window", 0);
     for(;wnd>0;)
  {
     PostMessage(hwnd, WM_KEYDOWN, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1);
    PostMessage(hwnd, WM_KEYUP, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1 | 1 << 30 | 1 << 31);
PostMessage(hwnd, WM_KEYDOWN, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1);
PostMessage(hwnd, WM_KEYUP, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1 | 1 << 30 | 1 << 31);
 
Application->ProcessMessage();
 
}
3. На кнопку 1 назначил включение таймера:
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Timer1 -> Enable = true;
}
4. На кнопку 2 назначил выключение:
C++
1
2
3
4
void __fastcall TForm1::Button9Click(TObject *Sender)
{
Timer1 -> Enable = false;
}
И терь выдаёт вот такие ошибки:
[C++ Error] Unit1.cpp(109): E2247 '_fastcall TApplication::ProcessMessage(tagMSG &)' is not accessible
[C++ Error] Unit1.cpp(118): E2316 'Enable' is not a member of 'TTimer'
[C++ Error] Unit1.cpp(124): E2316 'Enable' is not a member of 'TTimer'

Добавлено через 4 минуты
[C++ Error] Unit1.cpp(118): E2316 'Enable' is not a member of 'TTimer'
[C++ Error] Unit1.cpp(124): E2316 'Enable' is not a member of 'TTimer'

исправил
я просто не доглядел и вместо Enabled написал Enable

[C++ Error] Unit1.cpp(109): E2247 '_fastcall TApplication::ProcessMessage(tagMSG &)' is not accessible

А с этим не знаю что делать((
0
LK
Заблокирован
14.02.2012, 18:04 9

Не по теме:

без няньки никак :) ?

C++
1
Application->ProcessMessages();
Цитата Сообщение от LK Посмотреть сообщение
C++
1
Timer->Enabled = true;
и
C++
1
Timer->Enabled = не true;
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 18:06  [ТС] 10
C++
1
Application->ProcessMessages();
я так и ввёл в код таймера
0
LK
Заблокирован
14.02.2012, 18:09 11
Почему тогда в ругательстве без s :
[C++ Error] Unit1.cpp(109):E2247 '_fastcall TApplication::ProcessMessage[?](tagMSG &)' is not accessible
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 18:16  [ТС] 12
Ты прав я потом исправил это, но у меня всё равно прога виснет(((
а цикл for(;wnd>0 по-любому убрать придётся?
Я его убрал но всё равно прога виснет(((
0
LK
Заблокирован
14.02.2012, 18:25 13
я не знаю, что такое wnd>0 и какую оно играет роль.
ага, понял - как по мне, то не надо, для проверки достаточно того, что у вас было
C++
1
if(wnd>0)
, т.е.,

C++
1
2
3
4
5
6
if(wnd>0) {
  PostMessage(hwnd, WM_KEYDOWN, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1);
  PostMessage(hwnd, WM_KEYUP, VK_TAB, MapVirtualKey(VK_TAB, 0) << 16 | 1 | 1 << 30 | 1 << 31);
  PostMessage(hwnd, WM_KEYDOWN, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1);
  PostMessage(hwnd, WM_KEYUP, VK_F1, MapVirtualKey(VK_F1, 0) << 16 | 1 | 1 << 30 | 1 << 31);
}
но в ваши красивые и разные PostMessage я не вникал, и поэкспериментируйте с интервалом таймера - 2000, 3000.

что касается
C++
1
Application->ProcessMessages();
, то в таймере оно и не шибко надо, оно более пригодно для циклов и того же слипа.
0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 19:06  [ТС] 14
всё получилось спс))
0
59 / 56 / 8
Регистрация: 22.07.2011
Сообщений: 436
14.02.2012, 21:29 15
Если закинуть на форму таймер (он находится во вкладке System) установить интервал в 1000 мс и в обработчике событий сделать это:
C++
1
2
3
4
5
void __fastcall TForm1::TimerTimer(TObject *Sender)
{
PostMessage(hwnd, WM_KEYDOWN, VK_F12, MapVirtualKey(VK_F12, 0) << 16 | 1);
PostMessage(hwnd, WM_KEYUP, VK_F12, MapVirtualKey(VK_F12, 0) << 16 | 1 | 1 << 30 | 1 << 31);
}
то приложение будет посылать нужному окну сообщение о нажатии.

Не по теме:

Я понял, что за приложение вы пишете. Писал совершенно идентичное (я про Nksp), но делал всё сам, без нянек и всё прекрасно получалось.

0
3 / 3 / 2
Регистрация: 13.02.2012
Сообщений: 161
14.02.2012, 21:54  [ТС] 16
понятно
а можно как нибудь сделать регистрацию для программы?))
0
LK
Заблокирован
14.02.2012, 21:59 17
Клод, можно, но уже в новой теме: Правила
2.4. На каждый вопрос создавайте по одной теме - это помогает избежать путаницы в ответах и облегчает поиск.
Или эта тема будет закрыта.
0
14.02.2012, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2012, 21:59

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

Отправка сообщений
имеется код &lt;? // ----------------------------конфигурация-------------------------- // ...

Отправка сообщений
Добрый день ув. форумчане. Нужна ваша помощь!!!! Имеется программа написана на Delphi 7 с...

Отправка сообщений
Помогите Плииз с программой.. Мне нужен код для отправки сообщения на email того, кто...

Отправка сообщений
Помогите реализовать следующее: 1. форма ввода имя + почта как-то так &lt;form id=&quot;form&quot;&gt; ...

Отправка сообщений
Здравствуйте. Есть ли у кого код на ЧИСТОМ с++ который отправляет письмо на почту-это пока) если...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru