Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
144 / 28 / 4
Регистрация: 06.05.2019
Сообщений: 1,839
Записей в блоге: 4

Как правильно активировать окно и переключить фокус клавиатуры на него в чужом потоке с использованием оконных сообщений

16.12.2021, 05:23. Показов 7229. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я почитал инструкции которые здесь описаны https://docs.microsoft.com/en-... g-messages, тема довольно объёмная сложная, примеров очень мало. Значит я нахожу дескриптор окна по этому алгоритму(в дальнейшем его можно переделать на более простой если система конечно не запрещает отправлять сообщения к не вызывающим потокам) https://www.cyberforum.ru/blog... g7148.html, далее после 64ой строчки дописываю код.
C++
1
2
3
4
5
6
7
8
9
10
11
tagMSG MSG;
cout<<"не допустимый идентификатор потока ERROR_INVALID_THREAD_ID "<<ERROR_INVALID_THREAD_ID<<en;//выдаёт 1444
cout<<"GetLastError "<<GetLastError()<<en;
tagGUITHREADINFO GUITHREADINFO={sizeof(GUITHREADINFO)};
 
cout<<"PeekMessageA "<<PeekMessageA(&MSG,g_HWND[1],WM_KEYFIRST,WM_KEYLAST,PM_QS_SENDMESSAGE)<<en;//PM_NOREMOVE/Примечание 1
cout<<"GetLastError "<<GetLastError()<<en;//
cout<<"PostThreadMessageA "<<PostThreadMessageA(pe32pt.th32ThreadID,WA_ACTIVE,WA_ACTIVE,(LPARAM)GetForegroundWindow())<<en;//Примечание 2.
cout<<"GetLastError "<<GetLastError()<<en;//
cout<<"GetGUIThreadInfo "<<GetGUIThreadInfo(pe32pt.th32ThreadID,&GUITHREADINFO)<<en;//Примечание 3.
cout<<"GetLastError "<<GetLastError()<<en;//
Примечание 1. По идее данная функция должна создавать очередь или давать информацию о ней, в моём случае она пуста. Я пробовал и сразу сообщение посылать
cout<<"PeekMessageA "<<PeekMessageA(&MSG,g_HWND[1],WA_ACTIVE,WM_KEYLAST,PM_QS_SENDMESSAGE)<<en;//не знаю или это корректно. Результата нет.
Примечание 2. По идее эта функция должна посылать сообщение в другой поток, обычно для этого требуются бешеные привилегии и такие функции как правило не работают. Хотя в инструкции сказано что такие привилегии нужны если идёт работа с удалённым рабочим столом.
Я посылаю команду на активацию и переключения реагирования клавиатуры поэтому 2 раза указываю WA_ACTIVE. Последним параметром я пишу
о том что нужно снять активацию с текущего окна, т.е. любого окна верхнего уровня, т.к. работаю с дебагом то понятно что на переднем плане
компилятор а не запускаемая программа. В инструкции сказано что можно 0 писать, может система сама снимает активацию. Это очень странно что её нужно снимать с 1го окна и переводить
на другое возникает вопрос как работать во многопотоке, там что тоже активация постоянно переключается и создаётся впечатления что активация не снимается.
Примечание 3. Получаю информацию.
В конечном итоге получаю ошибку 1159 что говорит о некой синхронизации не совсем понятно почему если я укзал что нужно снять с верхнего окна активацию и переключиться на
g_HWND[1]. Проверил дескриптор окна он верный, номер потока тоже да и в принципе здесь записано так if(GetWindowThreadProcessId(g_HWND[1]=(HWND)++rrr[0],&rrr[1])==pe32pt.th32ThreadID)...
что в принципе проверяет возвращается ли номер потока с участием этого процесса ну и конечно дескриптора окна. Хотя можно и вручную вбить
разницы нет.
Покажите пример как эти функции выполнют такую задачу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.12.2021, 05:23
Ответы с готовыми решениями:

Как переключить фокус программы на нужное окно?
Предположим я запустил браузер char*put=&quot;\&quot;&quot;&quot;/Program Files/Mozilla Firefox/firefox.exe&quot;&quot;\&quot;&quot;; system(put); , спустя какое-то время...

Переключить раскладку клавиатуры в чужом окне
Переключить раскладку клавиатуры в чужом окне на определенную не просто на любую, а именно на русскую или английскую какую укажу.

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

20
0 / 0 / 0
Регистрация: 17.12.2021
Сообщений: 11
22.12.2021, 10:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Nexi99 Посмотреть сообщение
С какими параметрами посоветуете вызвать эту функцию
Code
1
FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER
. Вообще, надо было сказать раньше, что через нее можно было бы отформатировать вывод ошибки. Тут мой косяк, об этом правда стоило сказать ранее.
Цитата Сообщение от Nexi99 Посмотреть сообщение
можно ли посылать сообщения из консоли
Пробуй связку SendMessage вместе с ReplyMessage, только учти, что SendMessage не вернет значение, пока не обработается сообщение в другом потоке (которое ты отправила). Можно проверить, обрабатывается ли в текущее время отправленное сообщение, вызвав InSendMessage.
Цитата Сообщение от Nexi99 Посмотреть сообщение
может нужен WinMain?
Ну, WinMain используется по стандарту кодинга по винду, вот (хотя ничего не такого не будет, если захочешь использовать кастомные EP с объявляением APIENTRY). Тебе тогда нужно будет вызывать саму консоль в начале функции.
Цитата Сообщение от Nexi99 Посмотреть сообщение
Функция GetWindowRect сворачивает и разворачивает окно. Иногда возникает ошибка 5ть.
Поэтому и есть смысл обрабатывать ошибки.
C
1
2
3
4
5
6
7
8
9
10
11
//Получаем ID ошибки и выводим в MessageBoxW для наглядности
void GetErrorWin32() {
    DWORD ErrId = GetLastError();
    HLOCAL wStrBuff = NULL; //Буффер для строки
 
    FormatMessageW((FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER),
                    NULL, ErrId, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), &wStrBuff, 0, NULL);
 
    //Выводим "сообщение" ошибки (можно воспользоваться wprintf, если нет желания вызывать MessageBoxW)
    MessageBoxW(NULL, wStrBuff, L"Win32 Err", MB_OK);
}
Цитата Сообщение от Nexi99 Посмотреть сообщение
Я не знаю что означает этот результат и что нужно передавать в функцию на некоторые параметры.
GetWindowRect принимает хендл (HWND) окна и указатель на RECT структуру.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2021, 10:40

Как переключить фокус на другую открытую форму?
Открыто 2 формы. Надо из одной переключить фокус на другую. Пробовал разные варианты: DoCmd.SelectObject acForm, 'Заказы' ...

Как правильно создать двумерный массив указателей с использованием calloc? и ввод данных в него
Как правильно создать двумерный массив указателей с использованием calloc и ввести в него данные?

Проблема с перехватом оконных сообщений
#include &quot;stdafx.h&quot; #include &quot;windows.h&quot; #include &quot;111.h&quot; #define MAX_LOADSTRING 100 // Глобальные переменные: int i = 100; ...

Как переключить раскладку клавиатуры из VB?
Подскажите, как переключить раскладку клавиатуры из VB?. (Желательно без Pron32.dll) Заранее спасибо.

Обьясните логику в Последовательности оконных сообщений
Отлавливаю сообщения которые прходят в proc функцию , 1) когда с другой вкладки переключаюсь на ту где находится контрол 1. 24 - ...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Новые блоги и статьи
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru