powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
8 сообщений из 8, страница 1 из 1
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38227990
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GetThemeSysString function
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Syntax
C++
 
HRESULT GetThemeSysString(
  _In_   HTHEME hTheme,
  _In_   int iStringID,
  _Out_  LPWSTR pszStringBuff,
  _In_   int cchMaxStringChars
);



Пытаюсь

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
'String theme metric properties
Public Const TMT_CSSNAME = 1401
Public Const TMT_XMLNAME = 1402
Public Const TMT_FIRSTSTRING = TMT_CSSNAME
Public Const TMT_LASTSTRING = TMT_XMLNAME

Public Const S_OK = &H0
 
Public Declare Function GetThemeSysString Lib "UxTheme.dll" (ByVal hTheme As Long, _
 ByVal iStringID As Long, ByRef pszStringBuff As Long, ByVal cchMaxStringChars) As Long
Public Declare Function GetWindowTheme Lib "UxTheme.dll" (ByVal hwnd As Long) As Long

Private Sub CommandGetTheme_Click()
  Dim hTheme As Long
  Dim theme_str As String
  Dim lng_str As Long
  hTheme = GetWindowTheme(g_hwndRebar_txtTop)
  theme_str = Space$(80)
  If GetThemeSysString(hTheme, TMT_CSSNAME, VarPtr(theme_str), 80) = S_OK Then
    MsgBox theme_str
  End If
End Sub



hTheme -я long получаю
Что только не делал с 3-м параметром в GetWindowTheme
Выдает Er.49 Bad dll calling conversion

Как это записать?
Если получу указатель Ptr в 3-м параметре, то unicode -str я оттуда вытяну, опыт есть, но надо получить.
А примеров декларации для VB6 нигде нету.

P.S. Хочу все-таки докопаться до мутно-зеленого тулбара, покоя он мне не дает.
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228128
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начинать нужно с гугла .
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228183
Дмитрий77,

ByVal pszStringBuff As Long, ByVal cchMaxStringChars As Long
не VarPtr(theme_str), а StrPtr(theme_str)
У меня GetThemeSysString возвращает E_HANDLE, так что далее сами.
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228275
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать то сделал. Ошибка была тупая:
Код: vbnet
1.
If GetThemeSysString(hTheme, TMT_CSSNAME, VarPtr(theme_str), 80) = S_OK Then


надо было приравнивание в скобки взять:

Код: vbnet
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.
'String theme metric properties
Public Const TMT_CSSNAME = 1401
Public Const TMT_XMLNAME = 1402
Public Const TMT_FIRSTSTRING = TMT_CSSNAME
Public Const TMT_LASTSTRING = TMT_XMLNAME

Public Const S_OK = &H0
 
Public Declare Function GetThemeSysString Lib "uxtheme.dll" (ByVal hTheme As Long, _
                                                              ByVal iStringId As Long, _
                                                              ByVal pszStringBuff As Long, _
                                                              ByVal pszStringBuff As Long) As Long


Private Sub CommandGetTheme_Click()
  Dim hTheme As Long
  Dim theme_str As String
  Dim lng_str As Long
'  TextHWND.Text = HexToText(TextHEX.Text, False)
  lng_str = TextHWND.Text
  hTheme = GetWindowTheme(lng_str)
  theme_str = Space$(80)
  If (GetThemeSysString(hTheme, TMT_CSSNAME, StrPtr(theme_str), 80) = S_OK) Then
    MsgBox theme_str
  Else
    MsgBox "error!"
  End If
  theme_str = Space$(80)
  If (GetThemeSysString(hTheme, TMT_XMLNAME, StrPtr(theme_str), 80) = S_OK) Then
    MsgBox theme_str
  Else
    MsgBox "error!"
  End If
End Sub



Имеем вот что:
Вариант 1:
1) Запускаем свое окно, где Caption= "My test Window"
и есть Rebar
2) Запускаем Spy++
Ищем "My test Window"
3) Находим типа
Window 019C0932 "My test window"
4) Там находим типа
Window 00C4095A '"' ReBarWindow32
5) Вводим в текстовое поле
&H00C4095A -правильно?
6) получаем результат:
TMT_CSSNAME -> cpwebvw.css
TMT_XMLNAME -> default.xml
Причем для всех моих ребаров при включенных темах, причем неважно "media", "communications" или default, или на XP
выдает именно эти два имени файла.

Моя задача добраться до ребара в Explorer (проводник) - типа надеюсь увидеть что-то другое (или хотя бы тоже самое).

Вариант 1:
1) Открываем любую папку, где напр. Caption= "My Test Folder"
2) Запускаем Spy++
Ищем "My Test Folder"
3) И Находим!!! типа
Window 00A90A62 "My Test Folder"
4) Там находим типа
Window 013B0A44 '"' WorkerW
а далее
Window 00990998 '"' ReBarWindow32
5) Вводим в текстовое поле
&H00990998 -правильно??????
6) получаем результат:
TMT_CSSNAME -> error!
TMT_XMLNAME -> error!
Другого не получается.

То ли я с hex-ами работать не умею и неправильно получаю hwnd?
То ли ЧТО?
Для моих то тулбаров все ведь работает S_OK-> результат

Сейчас пока правда на XP только пробовал(темы включены)...
Ладно, попробую еще над вистой поиздеваться, собаку то я именно там ищу.
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228372
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77&H00990998 -правильно??????да. даже &H990998 правильно.
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228394
Дмитрий77,

дело не в скобках. Сравните ещё раз:
Код: vbnet
1.
If GetThemeSysString(hTheme, TMT_CSSNAME, VarPtr(theme_str), 80) = S_OK Then

и
Код: vbnet
1.
If (GetThemeSysString(hTheme, TMT_CSSNAME, StrPtr(theme_str), 80) = S_OK) Then



> То ли ЧТО?
Может, из другого процесса нельзя?
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228404
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й квартал,

бог с ним с этими скобками. StrPtr вы правы конечно.

А чем мое окно отличается от чужого?
По крайней мере если запустить 2 моих одинаковых, то на тот hwnd где работает, срабатывает при вызове из любого из них.

Ну хоть какой-то результат таки есть:
TMT_CSSNAME -> cpwebvw.css
TMT_XMLNAME -> default.xml

cpwebvw.css -имя ресурса в файле
Windows\Resources\Themes\Aero\Shell\NormalColor
ресурсы ->23 ->cpwebvw.css

Та м особо ничего нет интересного.

Но там в ресурсах есть еще MUI->1->1033
И меня заинтересовало вот это:
Код: xml
1.
2.
3.
4.
5.
<TemplateBackground background="Gradient(argb(255, 4, 80, 130), argb(255, 17, 101, 132), argb(255, 29, 121, 134), 3)" />
<if id="atom(MiddleLayer)">
<TemplateBackground
background="dtb(Rebar, RP_BACKGROUND, 0)"
/>


Я вот не могу понять, как этот градиент воспроизвести (ну через gdi что ли), чтоб на него посмотреть.
М.б. это оно и есть? и ни фига это не стиль -ни в одной программе кроме проводника этого "желаемого мутно зеленого" стиля нет. Причем он есть только на висте, а на 7-8 его нет.
...
Рейтинг: 0 / 0
Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
    #38228417
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче фигня это все.

Узнав hwnd ребара какого нибудь Fax and Scan еще можно поиграться со стилями этого ребар(сделать его не Communications).

Можно также "временно изгадить" стиль верхней прозрачной панели explorer. Но применить ничего к "мутно-зеленой части", напр. поменять на Communications или отключить стиль не получается даже временно.
Скорее всего там жесткий сабклассинг со стороны самой explorer.exe, и именно explorer.exe эту зеленую муть для себя отрисовывает, и только на висте. Единственный вариант, если уж очень хочется, воспользоваться градиентами от Бенедикта (в теме про тулбар, кот. я недавно поднял наверх), но сделать это нормально видимо не так просто, потому что если поставишь ребару классик, то это применится и к тулбару тоже (а сам тулбар при этом должен быть Communications или Media - белый шрифт, стиль кнопок и т.п.). А если стиль с ребара не снимать, то фиг ему свой градиент нарисуешь. Хотя, градиент наверно можно пририсовать банду, а от гриппера отказаться (в explorer кстати гриппера нет).
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Объясните мне как правильно API написать и вызвать, видимо рука еще не настолько набита
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]