purebasic.info

PureBasic forum
Текущее время: Пт дек 14, 2018 3:41 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: задать высоту заголовка окна
СообщениеДобавлено: Сб дек 09, 2017 3:50 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
Извиняюсь за новую тему, но может кто знает как чужому окну можно задать высоту заголовка? Не видел ничего подобного. В самой ОС есть такая настройка, но она применяется ко всем окнам сразу, а надо к конкретному.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Вс дек 10, 2017 3:30 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 272
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Так пойдет? API DwmExtendFrameIntoClientArea. :?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Вс дек 10, 2017 9:24 am 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
repeat, спасибо за наводку. Хотя в той теме ссылка битая, нашёл у нас похожее. Да, тоже проскакивала такая мысль - изменить клиентскую часть, либо скин одеть.
Меня просили уменьшить высоту заголовка до нескольких пикселей, чтобы не занимал лишнее место и в то же время было за что ухватиться (для перемещения). Как такое сделать с чужим окном, загадка.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Вс дек 10, 2017 11:32 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6412
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Изменение стилей окна производится при помощи SetWindowLongPtr_
Чужие или свои окна не важно.
Важно знать Hwnd изменяемого окна.
Пример с Блокнотом у которого я убираю заголовок и рамку:
Код:
1
2
3
Hwnd=FindWindow_("Notepad",0)
SetWindowLongPtr_(Hwnd, #GWL_STYLE, GetWindowLongPtr_(Hwnd, #GWL_STYLE) ! (#WS_DLGFRAME | #WS_BORDER | #WS_SIZEBOX))
 


Только заголовок убираю
Код:
1
2
Hwnd=FindWindow_("Notepad",0)
SetWindowLongPtr_(Hwnd, #GWL_STYLE, GetWindowLongPtr_(Hwnd, #GWL_STYLE) ! ( #WS_BORDER  ))


Можно двигать окно изменяя его размеры.

MSDN говорит, что иногда данные кешируются и SetWindowLongPtr сразу не срабатывает. Тогда надо после применить SetWindowPos_ и изменения сработают.

Повторное применение SetWindowLongPtr восстанавливает как было.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Вс дек 10, 2017 12:44 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
kvitaliy, спасибо конечно, но это немного не то. Уже предлагал подобное, но теперь человек хочет не совсем убрать заголовок, а уменьшить его, скажем, до 4-х пикселей. Чтобы была возможность "таскать" окно за то, что осталось от заголовка. Такая вот нестандартная задача, которую никогда раньше не встречал. А про то, что Вы говорите у меня сейчас так записано (и работает):
Код:
1
2
3
4
5
6
7
8
 
; убираю
SetWindowLong_(hWnd, #GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)&~#WS_CAPTION);&~#WS_SIZEBOX)
SetWindowPos_(hWnd, 0, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_FRAMECHANGED|#SWP_DRAWFRAME)
 
; восстанавливаю
SetWindowLong_(hWnd, #GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)|#WS_CAPTION|#WS_SIZEBOX)
SetWindowPos_(hWnd, 0, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_FRAMECHANGED|#SWP_DRAWFRAME)



Добавлено:
Задача вызывает сомнения - возможно ли это вообще? Своё-то окно можно отрисовать как угодно и контролов понаставить сколько угодно. А тут чужое. Поэтому пришёл за помощью к старшим.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 7:43 am 
Не в сети
профессор

Зарегистрирован: Сб фев 06, 2016 6:18 pm
Сообщений: 272
Благодарил (а): 14 раз.
Поблагодарили: 32 раз.
Пункты репутации: 0
Как вариант. Хорошо бы еще добавить событие "WM_LBUTTONDOWN" но, оно не приходит... :?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Global *WndProc1
 
ProcedureDLL WindowProc(hWnd.l, uMsg.l, wParam.l, lParam.l)
  If uMsg = #WM_NCHITTEST
    If DefWindowProc_(hWnd, uMsg, wParam, lParam) = #HTMENU
      SendMessage_(hWnd, #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
    EndIf
  EndIf
  ProcedureReturn CallWindowProc_(*WndProc1, hWnd, uMsg, wParam, lParam)
EndProcedure
 
 
ProcedureDLL AttachProcess(Instance)
  hWnd.l = FindWindow_("TTOTAL_CMD", 0)
 
  SetWindowLong_(hWnd, #GWL_STYLE, GetWindowLong_(hWnd, #GWL_STYLE)&~#WS_CAPTION);&~#WS_SIZEBOX)
  SetWindowPos_(hWnd, 0, 0, 0, 0, 0, #SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_FRAMECHANGED|#SWP_DRAWFRAME)
 
  *WndProc1 = SetWindowLong_(hWnd, #GWL_WNDPROC, @WindowProc())
  ProcedureReturn
EndProcedure



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 7:50 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
repeat, спасибо за вариант. Идея понятна.
Код:
1
SendMessage_(hWnd, #WM_NCLBUTTONDOWN, #HTCAPTION, 0)


Позволяет перемещать окно не только за заголовок. Но чтобы процедура CallBack постоянно работала нужно эту dll внедрить в процесс TotalCmd, верно? И это возможно только при запуске самого TC.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 7:53 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6412
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Проще свой заголовок нужного размера нарисовать над нужным окном, и за него таскать всю конструкцию.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 8:04 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
kvitaliy, и своё окно сделать родителем тотала? Тоже конечно вариант, но как быть с тем когда захотят изменить размеры окна тотала? всё-равно прийдётся это отслеживать и подгонять размер своего окна под тотал. как ни крути, а всё равно получается резидентная программа. :(


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 9:35 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6412
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
knower писал(а):
подгонять размер своего окна под тотал

А зачем делать размер места, за которое только таскать во всё ширину? Вот примерно так можно сделать, что бы наша программа следила за чужим окном, и двигала чужое окно за собой. Размеры чужого окна мы беспрепятственно изменяем.
Получается своеобразный лоадер, который сам запускает программу и сам закрывается, когда программы нет.
На примере Блокнота:
Код:
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
RunProgram("notepad.exe")
Delay(500)
 
Procedure OpenWindow_Window_0()
  OpenWindow(0, 100,100, 100, 15, " ", #PB_Window_BorderLess|#PB_Window_Invisible)
  SetWindowColor(0, $FF0000)
  SetClassLongPtr_(WindowID(0), #GCL_STYLE, $00020000)
  HideWindow(0, #False)
  StickyWindow(0,1)
EndProcedure
OpenWindow_Window_0()
  WX=WindowX(0, #PB_Window_InnerCoordinate)
  WY=WindowY(0, #PB_Window_InnerCoordinate)
hwnd = FindWindow_("Notepad",0);
If  hwnd
  SetWindowLongPtr_(Hwnd, #GWL_STYLE, GetWindowLongPtr_(Hwnd, #GWL_STYLE) ! ( #WS_BORDER  ))
  SetWindowPos_(hwnd, #HWND_BOTTOM, WX, WY+15, 800, 600, #SWP_NOSIZE);
EndIf
 
;{- Event loop
Repeat
  Event = WaitWindowEvent(10)
 
  If GetForegroundWindow_()<>hwnd
    StickyWindow(0,0)
  Else
    StickyWindow(0,1)
  EndIf
 
  If  FindWindow_("Notepad",0)=0
     CloseWindow(0)
     Break
   EndIf
       
  Select Event
   Case #WM_LBUTTONDOWN
     SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
   Case #PB_Event_MoveWindow
      WX=WindowX(0, #PB_Window_InnerCoordinate)
      WY=WindowY(0, #PB_Window_InnerCoordinate)
      SetWindowPos_(hwnd, #HWND_BOTTOM, WX, WY+15, 1, 1, #SWP_NOSIZE);
  EndSelect
ForEver
;
;}
 


Правда, тут проблема с запуском нескольких одинаковых программ.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 10:04 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
kvitaliy, спасибо большое за желание помочь. Но... как-то выглядит это не совсем естественно. Вариант, предложенный repeat будет посимпатичней. kvitaliy, подскажи лучше, если не жалко, как безопасней сделать инъекцию такой dll. Ором антивирусов можно пренебречь. Просматриваю сейчас старые коды (перехвата API, про "сапёра" и т.д.).

Добавлено:
Также вспомнилось, что Пётр когда-то говорил, что можно избежать инъекций. Путём дополнения/расширения одной из мелких библиотек (с наименьшим содержанием функций), которую использует целевая программа.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Пн дек 11, 2017 10:54 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
knower писал(а):
Путём дополнения/расширения одной из мелких библиотек (с наименьшим содержанием функций), которую использует целевая программа.
Несколько примеров таких библиотек viewtopic.php?f=10&t=4348

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Вт дек 12, 2017 6:54 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6412
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
knower писал(а):
Путём дополнения/расширения одной из мелких библиотек (с наименьшим содержанием функций), которую использует целевая программа.

Ну да, там смысл в том, что программа подхватывает DLL не из системной папки, а из своей. Делаем DLL с такими же именем, как и системная, подменяем функцию на свою. Это очень специально для конкретной программы.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: задать высоту заголовка окна
СообщениеДобавлено: Вт дек 12, 2017 9:28 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6412
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Пример можно тут посмотреть, там плагин для uTorrent, работает по этому же принципу.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Bing [Bot] и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB