Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/63: Рейтинг темы: голосов - 63, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 17.11.2009
Сообщений: 8
1

PostMessage(hWnd,WM_KEYDOWN,VK_F5,0)

15.02.2011, 14:08. Показов 11520. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день

подскажите пож. как передать в другое приложение произвольный символ?
PostMessage(hWnd,WM_KEYDOWN,VK_F5,0) - передает F5 в приложение,
а как передать например символ 'пробел' или '1' ?

--
Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2011, 14:08
Ответы с готовыми решениями:

PostMessage+FindWindow+WM_KEYDOWN
Такая проблема, при использовании PostMessage + FindWindow для нажатия клавиши(WM_KEYDOWN), не...

Цикл и PostMessage
Добрый день. PostMessage отказывается работать в цикле, как я понимаю, что не успевает отработать ...

PostMessage VS Win 10
На данной версии ОС,напрочь отказываются работать PostMessage, ни кто не сталкивался?

PostMessage, SendMessage
Здравствуйте. Вопрос такой: я посылаю сообщения PostMessage и SendMessage в свернутое окно чужой...

10
68 / 68 / 9
Регистрация: 10.02.2011
Сообщений: 131
15.02.2011, 14:18 2
Гугл в помощь
0
LK
Заблокирован
15.02.2011, 21:11 3
Цитата Сообщение от igor-x Посмотреть сообщение
подскажите пож. как передать в другое приложение произвольный символ?
- тема - рядом : Как соединиться с программой - там есть и про вашу проблему.
0
Retired
7727 / 2559 / 671
Регистрация: 17.10.2009
Сообщений: 5,100
16.02.2011, 03:52 4
Цитата Сообщение от igor-x Посмотреть сообщение
а как передать например символ 'пробел' или '1' ?
Пробел
C++
1
PostMessage(hWnd, WM_KEYDOWN, VK_SPACE, 0);
Цифры (0x30 - 0x39)
C++
1
PostMessage(hWnd, WM_KEYDOWN, 0x30, 0);
1
0 / 0 / 0
Регистрация: 17.11.2009
Сообщений: 8
16.02.2011, 09:10  [ТС] 5
Цитата Сообщение от Inadequate Посмотреть сообщение
Пробел
C++
1
PostMessage(hWnd, WM_KEYDOWN, VK_SPACE, 0);
Цифры (0x30 - 0x39)
C++
1
PostMessage(hWnd, WM_KEYDOWN, 0x30, 0);
да спасибо, это работает, но не со всеми программами . например, Винамп не принимает такие Postmessage,
а SendMessage(HWND_BROADCAST, WM_KEYDOWN, 0x30, 0); принимает..
не подскажете в чем может быть дело?
HWND_BROADCAST к сожалению не очень удобен, таккак остальные программы тоже ловят его.
0
Retired
7727 / 2559 / 671
Регистрация: 17.10.2009
Сообщений: 5,100
16.02.2011, 11:50 6
Цитата Сообщение от igor-x Посмотреть сообщение
не подскажете в чем может быть дело?
Ну телепатические способности я уже давно растерял, но скорее всего не в то окно посылаешь сообщение.
0
0 / 0 / 0
Регистрация: 17.11.2009
Сообщений: 8
16.02.2011, 12:24  [ТС] 7
Цитата Сообщение от Inadequate Посмотреть сообщение
Ну телепатические способности я уже давно растерял, но скорее всего не в то окно посылаешь сообщение.
окно получаю так
C
1
2
3
   HANDLE hWnd;
    hWnd = GetForegroundWindow();
...
может эта функция иногда(не для всех окон) неверно определяет HANDLE?
0
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
16.02.2011, 13:16 8
попробуй это программкой навести на то место куда хочеш отсылать команды.

бывает такое что программа состоит из множества окон, многие безымянные, и у каждого свой хендл.
Вложения
Тип файла: rar WinSpy.rar (42.0 Кб, 171 просмотров)
1
0 / 0 / 0
Регистрация: 17.11.2009
Сообщений: 8
16.02.2011, 13:31  [ТС] 9
Цитата Сообщение от koldun Посмотреть сообщение
попробуй это программкой навести на то место куда хочеш отсылать команды.

бывает такое что программа состоит из множества окон, многие безымянные, и у каждого свой хендл.
но хендл меняется после перезапуска программы и не хотелосьбы каждый раз использовать WinSpy.exe. как же его определить ?
0
518 / 306 / 58
Регистрация: 30.07.2008
Сообщений: 607
16.02.2011, 14:45 10
Цитата Сообщение от igor-x Посмотреть сообщение
...например, Винамп не принимает такие Postmessage,
а SendMessage(HWND_BROADCAST, WM_KEYDOWN, 0x30, 0); принимает..
не подскажете в чем может быть дело?
PostMessage - ставит сообщение в очередь
SendMessage - отправляет "принудительно"

Добавлено через 20 минут
Вот я делал для Lineage кликер но переделать для чего то другого несложно
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
#include <windows.h>
#include <psapi.h>
//---------------------------------------------------------------------------
#pragma comment(lib, "C:\Program Files\Borland\CBuilder6\Lib\Psdk\psapi.lib")
//---------------------------------------------------------------------------
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
//---------------------------------------------------------------------------
#define raz 256 // !!!!!!!!!!!!!!
//---------------------------------------------------------------------------
struct TMyStruct
// структура
{
    HWND handle;
    String class_name;
    String window_caption;
    String binary_name;
    DWORD pid;
};
//---------------------------------------------------------------------------
TMyStruct win[raz];
int winlen = 0; // !!!!!!!!!!!!!!
//---------------------------------------------------------------------------
String wj_GetBinName(HWND handle_x)
{
    DWORD pid;
    String process;
    HANDLE hProc;
    char szProcessName[raz];
    HMODULE ahMod[32];
    DWORD dwNeeded;
    bool good = false;
    if(!handle_x)
    {
        return "null";
    }
    else
    {
        GetWindowThreadProcessId(handle_x, &pid);
 
        hProc = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, false, pid);
 
        if(hProc)
        {
            if(EnumProcessModules(hProc, ahMod, sizeof(ahMod), &dwNeeded))
            {
                if(GetModuleBaseName(hProc, ahMod[0], szProcessName, sizeof(szProcessName)))
                {
                    good = true;
                }
                else
                {
                    good = false;
                }
            }
            CloseHandle(hProc);
        }
    }
    if(good)
    {
        win[winlen].pid = pid;
        return String(szProcessName);
    }
    else
    {
        return "null";
    }
}
//---------------------------------------------------------------------------
bool wj_LGEN(HWND hWnd)
{
    char WindowName[raz];
    char ClassName[raz];
    GetWindowText(hWnd, WindowName, raz);
    GetClassName(hWnd, ClassName, raz);
    if(IsWindow(hWnd))
    {
        win[winlen].handle = hWnd;
        win[winlen].class_name = String(ClassName);
        win[winlen].window_caption = String(WindowName);
        win[winlen].binary_name = wj_GetBinName(hWnd);
        winlen++;
    }
    return true;
}
//---------------------------------------------------------------------------
void wj_ClickWindow(HANDLE Handle, int but)
{
// ПОСЫЛАЕМ НАЖАТИЕ КНОПКИ  WM_KEYDOWN + WM_KEYUP
    if(IsWindow(Handle) == true, Handle != 0)
    {
        SendMessage(Handle, WM_KEYDOWN, but, NULL);
        SendMessage(Handle, WM_KEYUP, but, NULL);
    }
}
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    EnumWindows((WNDENUMPROC)wj_LGEN, NULL); // заполняем структуру
    /*
    Итак мы имеем:
    win[i].handle; // Хендл окна
    win[i].class_name; // имя класса окна
    win[i].window_caption; // заголовок
    win[i].binary_name; // имя исполняемого ЕХЕ файла
    win[i].pid; // ПИД процесса
 
    winlen - это количество добавленных данных, в массив
    */
 
    for(int i = 0; i < winlen; i++)
    {
        if(win[i].window_caption.Pos("Lineage") == 1) // если в заголовке встречается "Lineage"
        {
            if(win[i].binary_name == "l2.bin" || win[i].binary_name == "l2.exe") // если имя процесса l2.bin или l2.exe
            {
                wj_ClickWindow(win[i].handle, VK_F1);
                // так наприме посылаем всем F1
            }
        }
    }
    winlen = 0;
 
    return NULL;
}
//---------------------------------------------------------------------------
///////////////////////
немного подправил для наглядности
2
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
16.02.2011, 15:42 11
Цитата Сообщение от igor-x Посмотреть сообщение
но хендл меняется после перезапуска программы и не хотелосьбы каждый раз использовать WinSpy.exe. как же его определить ?
Возможно я не совсем правильно выражусь, но постараюсь донести суть.

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

А дальше, находиш процесс, находишь все его составляющие компоненты, перечисялешь их, находиш нужный, узнаешь его хендл, и шлеш сообщения уже непосредственно туда.
0
16.02.2011, 15:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2011, 15:42
Помогаю со студенческими работами здесь

PostMessage - координаты объекта в игре
Идея такая. Как использовать postmessage знаю. Но вот используя spy++ он берет все окно 3d игры как...

Обработка сообщения от PostMessage другой программы
Здравствуйте, коллеги! Подскажите добрым словом, делом, а может быть и кодом. Есть приложение...

HWND в Label
Пишу такой код: HWND H; H = FindWindow(&quot;TForm1&quot;, &quot;Test&quot;); if (H == NULL) { ...

Convert void to HWND
Ошибка:E2034 Cannot convert 'void *' to 'HWND__ *' Понимаю что вопрос идиотский, но все же, что...

HWND и отправка им сообщений.
Здравствуйте, я начал изучать язык C++. А также начал обучение для работы с C++ Borland 6. Неддавно...

Глобально задать HWND
Здравствуйте! Я работаю в среде Builder 6. Меня интересует ответ на вопрос: Как объявить HWND для...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru