Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2022, 09:42   #11
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
При сворачивании окна WM_ACTIVATE или WM_SHOWWINDOW вы просто должны задать координаты одного из трех других углов. Тогда при разворачивании окна обычным способом, оно отобразится в другом углу экрана. См. SetWindowPos

Это все можно реализовать не вторгаясь в другое приложение с хуками и все будет в рамках задания. Прочитайте его внимательнее. По нажатию ЛКМ на пиктограмме ваше окно так и так будет развернуто.
Я реализовал, немного не так как вы описываете, но всё же. А что сразу не указали на это сколько времени было бы сэкономлено)


Цитата:
Сообщение от macomics Посмотреть сообщение
Кстати миниатюра тоже не ваше окно, просто панель задач создала пиктограмму вашего окна в виде картинки (которую регулярно обновляет) и создала еще одно свое окно с этой картинкой.
Короче говоря всё не моё, моё только иллюзия)


Цитата:
Сообщение от p51x Посмотреть сообщение
Потому что надо было в начале смотреть сообщения для вашего окна, а не лезть непонятно куда. Поставьте лог в ВАШУ функцюю окна и увидите.
Я так и делал. Когда окно развёрнуто на экране сообщения посылаются, когда свернул в пиктограмму, spy++ никак не реагировал.


Цитата:
Сообщение от p51x Посмотреть сообщение
Вам приходит сообщение сворачивания и разворачивания, вы их можете обработать... чего вам не хватает?
В смысле WM_GETMINMAXINFO:?
apofioz вне форума Ответить с цитированием
Старый 07.09.2022, 09:43   #12
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Код:
#include<windows.h>
#include<tchar.h>
 
BOOL RegClass(WNDPROC, LPCTSTR, UINT);
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
TCHAR szMainClass[] = TEXT("_MainClass_");
TCHAR szTitle[] = TEXT("Parent Window");
 
HINSTANCE hInstance;
int cxScreen, cyScreen;
int cxQuarterScreen, cyQuarterScreen;
int left = 0, top = 0;
 
int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE, PTSTR szCmdLine, int nCmdShow)
{
    MSG msg;
    HWND hwnd = NULL;
    hInstance = hInst;
    
    if(!RegClass(WndProc, szMainClass, COLOR_HIGHLIGHT))
        return FALSE;
    
    
    cxScreen = GetSystemMetrics(SM_CXSCREEN);
    cyScreen = GetSystemMetrics(SM_CYSCREEN);
    cxQuarterScreen = (cxScreen >> 2);
    cyQuarterScreen = (cyScreen >> 2);
    
    hwnd = CreateWindow(szMainClass, szTitle, 
                        WS_OVERLAPPEDWINDOW,
                        left, top,
                        cxQuarterScreen, cyQuarterScreen,
                        NULL, NULL, hInst, NULL);
                        
    if(!hwnd)
        return FALSE;
    
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);
    
    while(GetMessage(&msg, NULL, 0, 0))
    {
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
 
BOOL RegClass(WNDPROC proc, LPCTSTR szName, UINT brBackground)
{
    WNDCLASS wc;
    wc.style = CS_VREDRAW | CS_HREDRAW;
    wc.cbClsExtra = wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.lpfnWndProc = proc;
    wc.hbrBackground = (HBRUSH)(brBackground + 1);
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = (LPCTSTR)NULL;
    wc.lpszClassName = szName;
    
    return (RegisterClass(&wc) != 0);
}
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    WINDOWPLACEMENT wp;
 
    switch(msg)
    {
        case WM_SYSCOMMAND:
            if(wParam == SC_RESTORE)
            {
                wp.length = sizeof(wp);
                GetWindowPlacement(hwnd, &wp);
                wp.showCmd = SW_RESTORE;
                wp.flags = WPF_RESTORETOMAXIMIZED;
                SetRect((LPRECT)&wp.rcNormalPosition, 
                        cxScreen - cxQuarterScreen,
                        top,
                        (cxScreen - cxQuarterScreen) + cxQuarterScreen,
                        top + cyQuarterScreen);
                SetWindowPlacement(hwnd, &wp);
            }
            if(wParam == SC_CLOSE)
                break;
            return 0;
        case WM_LBUTTONDOWN:
            wp.length = sizeof(wp);
            GetWindowPlacement(hwnd, &wp);
            if(!IsIconic(hwnd))
            {
                wp.flags = WPF_SETMINPOSITION;
                //wp.ptMinPosition.x = 0;
                //wp.ptMinPosition.y = cyScreen;
                wp.showCmd = SW_MINIMIZE;
                SetWindowPlacement(hwnd, &wp);
            }
            
            return 0;
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
    }
    return DefWindowProc(hwnd, msg, wParam, lParam);
}
apofioz вне форума Ответить с цитированием
Старый 07.09.2022, 10:43   #13
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Короче говоря всё не моё, моё только иллюзия)
Вы так ничего и не поняли, похоже. Ваше только то, с чем вы можете работать напрямую. В данном слечае при создании окна вы получаете ручку (handle) только области ограниченной заголовком и все.

Если говорить о принадлежности, тогда вашему процессу принадлежит опять же только это окно. Проверить это можно через функции EnumWindows, EnumChildWindows и GetWindowThreadProcessId.
macomics вне форума Ответить с цитированием
Старый 07.09.2022, 11:51   #14
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Вы так ничего и не поняли
Я с этим и не спорю.

Цитата:
Сообщение от macomics Посмотреть сообщение
В данном слечае при создании окна вы получаете ручку (handle) только области ограниченной заголовком и все
Т.е. - рабочая область, место, где можно рисовать, вводить/выводить информацию та область, которая реагирует на стандартные виндовс сообщения, но ведь есть ещё WM_NCLBUTONDOWN... сообщения и они позволяют выходить за эту область. В каких случаях я теряю связь с окном, если так можно выразиться, например, я его свернул и всё стандартными средствами получить сообщение о клике мышкой не могу, и много таких специфических действий, после которых я получаю подобную ситуацию?

Пока что всё довольно абстрактно.(
apofioz вне форума Ответить с цитированием
Старый 07.09.2022, 12:17   #15
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
В каких случаях я теряю связь с окном, если так можно выразиться
Уничтожили окно и разрегали его класс

Цитата:
Сообщение от apofioz Посмотреть сообщение
я его свернул и всё стандартными средствами получить сообщение о клике мышкой не могу
Но вы же получаете. Вам же приходит и рестор, и шоувиндоу, ...
p51x вне форума Ответить с цитированием
Старый 07.09.2022, 13:44   #16
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
но ведь есть ещё WM_NCLBUTONDOWN.
В названии этого сообщения использована аббревиатура NC - Non Client, что указывает на рамку окна (я ее не исключал, когда говорил про область окна). Вы при создании окна указываете размеры окна с учетом его рамки - это и есть все ваше окно. Рамка окна только его часть, которая доступна по тому же handle.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 04:47   #17
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Вам же приходит и рестор, и шоувиндоу, ...
Куда приходит? Не понял.


Цитата:
Сообщение от macomics Посмотреть сообщение
Вы при создании окна указываете размеры окна с учетом его рамки - это и есть все ваше окно. Рамка окна только его часть, которая доступна по тому же handle.
Когда я создаю окно, получаю HANDLE окна, и делаю окно видимым, то получаю доступ к рабочей области окна с помощью стандартных средств WM_LBUTTONDOWN, WM_LBUTTONUP и.т.д., а при помощи WM_NCLBUTTONDOWN, WM_NCLBUTTONUP ещё и к заголовку окна, меню, рамке и.т.д. они могут так же реагировать на события маши, например, как и рабочая область окна. Это и есть то о чём я говорил т.е. я владею окном могу с ним работать. А когда я его свернул в пиктограмму, я переда управление окном ОС, так получается? Короче говоря ОС где-то в своих недрах хранить информацию об окне в конце концов она посылает сообщения функции конкретного окна, значит знает точно координаты окна. Да и сам дескриптор/описатель хранит определённую информацию, если разобраться.
А сами окна это какие-то шаблоны? я имею ввиду форму, стиль окна, внешний вид окон в каждой ОС разный.
apofioz вне форума Ответить с цитированием
Старый 08.09.2022, 05:05   #18
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
Это и есть то о чём я говорил т.е. я владею окном могу с ним работать. А когда я его свернул в пиктограмму, я переда управление окном ОС, так получается?
Не ОС, а explorer.exe - это просто приложение, но которое запускает оконный менеджер.

Цитата:
Сообщение от apofioz Посмотреть сообщение
А сами окна это какие-то шаблоны?
Если очень грубо говорить - да. Они называются классы.
macomics вне форума Ответить с цитированием
Старый 08.09.2022, 07:41   #19
apofioz
Форумчанин
 
Регистрация: 22.01.2014
Сообщений: 313
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Не ОС, а explorer.exe - это просто приложение, но которое запускает оконный менеджер.
Оконный менеджер и такой есть?! Т.е. создавая окно, информация о нём сохраняется(в какой-то структуре) в оконном менеджере, а HWND - это идентификатор окна, по которому оконный менеджер находит нужный экземпляр окна, ну, если кратко, видимо, как-то так)

А есть информация в более менее доступной форме об окнах, которая более тщательно, глубже, позволяет понять материал, может быть, это даст понимание материала. Просто вопросов много, а сформулировать их грамотно не могу!


Цитата:
Сообщение от macomics Посмотреть сообщение
Если очень грубо говорить - да. Они называются классы.
Их как-то возможно менять и какие стили есть? Попробую уточнить, что я имею ввиду, например, в Window 10, только, один стиль окна и без костылей создать окно, которое будет похоже на окно Window 7, невозможно?
apofioz вне форума Ответить с цитированием
Старый 08.09.2022, 12:39   #20
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от apofioz Посмотреть сообщение
А есть информация в более менее доступной форме об окнах, которая более тщательно, глубже, позволяет понять материал, может быть, это даст понимание материала. Просто вопросов много, а сформулировать их грамотно не могу!
https://docs.microsoft.com/en-us/win...winmsg/windows

Цитата:
Сообщение от apofioz Посмотреть сообщение
Их как-то возможно менять и какие стили есть?
Вы же сами создаете один такой через RegisterClass у вас в программе.

Цитата:
Сообщение от apofioz Посмотреть сообщение
Попробую уточнить, что я имею ввиду, например, в Window 10, только, один стиль окна и без костылей создать окно, которое будет похоже на окно Window 7, невозможно?
Для этого в ресурсы программы необходимо включить manifest
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Клик мыши по цвету xRamzeSx Общие вопросы Delphi 8 06.02.2012 00:58
Поймать клик мыши maks5 Общие вопросы Delphi 1 06.01.2012 00:01
Как поймать клик по строке в ListView? jungle Win Api 5 19.10.2009 10:10
TСhart, клик мыши и координаты XY, Определение координат оси при клике мыши Aravild Компоненты Delphi 1 31.01.2009 16:28
Клик мыши stayer Общие вопросы Delphi 1 30.10.2008 19:53