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

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

16.12.2021, 05:23. Показов 7019. Ответов 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
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru