Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для blbulyan
12 / 10 / 3
Регистрация: 31.10.2017
Сообщений: 126

Почему не работает SetWindowText для HotKeyControl при обработке WM_PAINT в процедуре подкласса?

29.03.2020, 22:32. Показов 685. Ответов 0

Студворк — интернет-сервис помощи студентам
Собственно вот такая вот проблема, хотел реализовать свой подкласс, функция уже написана, но всё валится на SetWindowText при обработке WM_PAINT, формирование самой строки для установки в HotKey Control работает, но текст изменить не удаётся, после вызова SetWindowText в HotKey Control текст вообще пропадает, а мой не устанавливается.
  1. Вот основные типы которые я определил:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    typedef std::wstring WSTRING;
    #ifdef _UNICODE 
    typedef std::wstring TSTRING;
    #define to_tstring(x) std::to_wstring(x)
    #else
    typedef std::string TSTRING;
    #define to_tstring(x) std::to_string(x)
    #endif
    struct ElementarHotKey {
        UINT Modifiers = NULL;
        UINT vk = NULL;
    };
  2. Вот функции написанные мной, от которых зависит процедура подкласса:
    C++
    1
    2
    3
    4
    5
    6
    7
    
    ElementarHotKey GetVkAndModifiersFromEnteredHotKey(WPARAM EneteredhotKey) {
        ElementarHotKey result;
        result.Modifiers = ((UINT)HIBYTE(LOWORD(EneteredhotKey)));
        result.vk = LOBYTE(LOWORD(EneteredhotKey));
        return result;
    }
    //текст MessageDebug не привёл, она выводит текст в консоль отладки, обёртка для OutputDebugString
  3. А вот и сама процедура подкласса:
    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
    
    LRESULT CALLBACK HotKeySubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam,LPARAM lParam,
        UINT_PTR uIdSubclass, DWORD_PTR dwRefData) {
        if (uIdSubclass != 0)return DefSubclassProc(hWnd, uMsg, wParam, lParam);
        switch (uMsg){
            case WM_PAINT:{
                ElementarHotKey HK = GetVkAndModifiersFromEnteredHotKey(SendMessageW(hWnd, HKM_GETHOTKEY, 0, 0));
                struct GetKeyNameData {
                    unsigned : 16;//unused
                    unsigned ScanCode : 8;//Скан код клаивиши
                    unsigned Extended : 1;//является ли клавиша расширенной
                    unsigned DNC : 1;//Игнорировать левый правый шифт и т.д.
                    unsigned : 6;//unused
                };
                if (HK.vk == VK__none_) {
                    WSTRING StringToOutput;
                    auto MyGetKeyName = [hWnd, uMsg, wParam, lParam](UINT vk, LPWSTR szKeyName, int cchSize)->POINT {
                        GetKeyNameData GKND = { 0 };
                        GKND.ScanCode = MapVirtualKeyW(vk, MAPVK_VK_TO_VSC);
                        GKND.Extended = 0;
                        GKND.DNC = 0;
                        POINT Result;
                        Result.x = GetKeyNameTextW(*((LONG*)&GKND), szKeyName, cchSize) != NULL;
                        if (Result.x == 0) {
                            TSTRING ErrorText = _TEXT("Не удалось получить имя данной клавиши клавиши, её vk:") + to_tstring(vk), ErrorCaption = _TEXT("Ошибка в функции ") __FUNCTION__  _TEXT(" на строке ") + to_tstring(__LINE__);
                            MessageDebug(ErrorText.c_str(), ErrorCaption.c_str());
                            Result.y = DefSubclassProc(hWnd, uMsg, wParam, lParam);
                        }
                        return Result;
                    };
                    POINT Result = { 0 };
                    WCHAR szKeyName[50] = { 0 };
                    UINT FlagsCheckHotKey[3] = { HOTKEYF_ALT , HOTKEYF_SHIFT, HOTKEYF_CONTROL };
                    UINT VkCodes[3] = { VK_MENU, VK_SHIFT, VK_CONTROL };
                    for (BYTE i = 0; i < 3; i++) {
                        if ((HK.Modifiers & FlagsCheckHotKey[i]) == FlagsCheckHotKey[i]) {
                            Result = MyGetKeyName(VkCodes[i], szKeyName, 50);
                            if (Result.x == 0) return Result.y;
                            else {
                                if (StringToOutput.size() > 0) {
                                    StringToOutput += L" + ";
                                    StringToOutput += szKeyName;
                                }
                                else StringToOutput += szKeyName;
                            }
                        }
                    }
                    if (StringToOutput.size() != 0)StringToOutput += L" + Fn";
                    else StringToOutput += L"Fn";
                    if (SetWindowTextW(hWnd, StringToOutput.c_str()) == 0)MessageDebug(_TEXT("Не удалось установить текст в HotKeyControl"), _TEXT("Ошибка в функции ") __FUNCTION__);
                    return TRUE;
                }
                else return DefSubclassProc(hWnd, uMsg, wParam, lParam);
            }
            default:
                return DefSubclassProc(hWnd, uMsg, wParam, lParam);
        }
    }
В чём дело? При этом, если вводить комбинацию без клавиши Fn то текст отображается(естественно, ведь вызывается дефолтный обработчик сообщения). Подкласс добавляю с помощью SetWindowSubclass.
P.S. Зачем оно мне надо? Всё дело в том, что клавишу Fn оно принимает, виртуальный код этой клавиши удаётся получить отправляя сообщение HKM_GETHOTKEY, но при этом, её название не отображается, а раз можно поставить, то должно быть название.

Добавлено через 5 часов 59 минут
Может быть всё таки есть способ поменять текст в окне HotKey Control?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.03.2020, 22:32
Ответы с готовыми решениями:

Глобальные и локальные переменные, одна и та же прога в процедуре Не работает, а просто так работает. Почему?
Здравствуйте, есть программка которая переводит из 2-ной системы в 10-ную. Она работает. А вот поместил я её в процедуру и работать...

Почему форма не реагирует на сообщение wm_paint при уменьшении размера окна?
На увеличение размеров окна, частичное вынесение формы за пределы экраны есть реакция в виде звукового сигнала, при уменьшении размеров...

Malloc в процедуре - почему не работает передача указателя
Доброго времени суток, есть такой код: #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void getInput (int *arr) { int n = 5; ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.03.2020, 22:32
Помогаю со студенческими работами здесь

Почему функции SendMessage и SetWindowText не работают?
всем доброго времени суток. может кто знает, подскажите, есть форма в другом приложении, на ней текстбокс, я хочу изменить текст в...

Почему слетают css-стили при обработке адресов?
array( &quot;CONDITION&quot; =&gt; &quot;#^/cup_(.*)/(.*)/#&quot;, &quot;RULE&quot; =&gt; &quot;CID=\$1&quot;, &quot;ID&quot; =&gt; &quot;&quot;, &quot;PATH&quot; =&gt; &quot;/\$2/index.php&quot;, ), ...

Почему нужно обязательно вызывать конструктор суперкласса в конструкторе подкласса?
Или же я не так понял ошибку, выданною NetBeans, при написании данного кода package javaapplication27; public class Figure { ...

Программа работает неадекватно при обработке нескольких изображений
...а я не могу найти ошибку. Программа написана для изменения мета-данных изображения. Она либо меняет мета-данные у одного...

Почему Eclipse не дает определить конструктор подкласса без использования слова super?
class Box { double width; double height; double depth; Box(double w, double h, double d) { width = w; ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
[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