Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скрыть кнопку с панели задач 
:(
    Опции темы
artsb
Дата 11.5.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(586 @  11.5.2008,  15:49 Найти цитируемый пост)
В начале кода напиши:

Не помогло :(

Кстати, а зачем при подключении некоторых библиотек нужно вставлять такие конструкции?


Цитата(586 @  11.5.2008,  15:49 Найти цитируемый пост)
hWnd - это хендл окна, а не кнопки

Значит, я указываю окно, а скрывается кнопка окна? Так?
А что делать если на экране отображается не главное окно, а дочернее (похоже в моём случае именно так, т.к. некоторые другие окна скрываются вместе с кнопками).



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 11.5.2008, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(artsb @  11.5.2008,  17:55 Найти цитируемый пост)
Не помогло :(

Значит не там написал.
Код
#define NO_WIN32_LEAN_AND_MEAN   // в самом начале
#include <vcl.h>
#include <shlobj.h>

А ещё лучше по всему проекту определи эту дерективу: Project -> Options-> Directories/Conditionals -> Conditionals -> "_DEBUG;NO_WIN32_LEAN_AND_MEAN"
Цитата(artsb @  11.5.2008,  17:55 Найти цитируемый пост)
зачем при подключении некоторых библиотек нужно вставлять такие конструкции?

Конфликт с VCL. На Visual С++ всё без этого идёт.
Цитата(artsb @  11.5.2008,  17:55 Найти цитируемый пост)
А что делать если на экране отображается не главное окно, а дочернее (похоже в моём случае именно так, т.к. некоторые другие окна скрываются вместе с кнопками).

Передавай то окно, которое привязано к панели задач (Application->Handle). (???)
PM   Вверх
artsb
Дата 11.5.2008, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(586 @  11.5.2008,  17:27 Найти цитируемый пост)
Значит не там написал.

Действительно. Проверил. Нужно ставить до #include <vcl.h>
Спасибо.
Я проверяю работу своей программы на Extract Icon Tool. Окно этой программы имеет заголовок "Extract Icon Tool v1.80", а на кнопке написано "Extract Icon Tool". Применил приведённый вами код. Окно программы скрылось, а кнопка нет. А вот после того как отобразил окно появилась ещё одна кнопка с таким же названием как и заголовок окна!
Что ещё можно сделать, чтобы скрыть кнопку? Нельзя ли сделать поиск кнопки по названию и применить к ней ShowWindow? У меня не получается найти хэндл кнопки.

Цитата(586 @  11.5.2008,  17:27 Найти цитируемый пост)
Передавай то окно, которое привязано к панели задач (Application->Handle)

Не понял. Я говорю про чужие окна. Как я узнаю их Application->Handle?

Это сообщение отредактировал(а) artsb - 11.5.2008, 19:14


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 11.5.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Попробовал так:
Код

button=FindWindowEx(FindWindow("Shell_TrayWnd",NULL),NULL,"ReBarWindow32",NULL);
if(button)
{
        ShowMessage("ReBarWindow32");
        button=FindWindowEx(button,NULL,"ToolbarWindow32",NULL);
        if(button)
        {
                ShowMessage("ToolbarWindow32");
                button=FindWindowEx(button,NULL,NULL,Edit2->Text.c_str());
                if(button)  ShowMessage("Button");
        }
}

Но сообщения "Button" не появляется. Как получить доступ к кнопке?

Добавлено через 14 минут и 46 секунд
Сделал следующее:
Скачал программу InqSoft Window Scaner. После её запуска, в качестве окна указал "ToolbarWindow32". Нажал в окне программы "Инструменты"->"Сканер toolbar'ов".Открылось дополнительное окно. Там нажал "Просканировать Toolbar". Программа показала список всех кнопок! Более того, можно управлять состоянием этих кнопок! Как она это делает?
user posted image
Если нажать на кнопку со стрелачками напротив выделенной надписи, кнопка прячется и отображается.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 11.5.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



deleted

Это сообщение отредактировал(а) 586 - 11.5.2008, 22:18
PM   Вверх
artsb
Дата 12.5.2008, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



не понял.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 12.5.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Почитай в MSDN про изменение состояний toolbar-кнопок (TB_GETBUTTONINFO / TB_SETBUTTONINFO). Т.к. будет передаваться структура, это придётся делать к контексте процесса explorer.exe (через dll или VirtualAllocEx). 
PM   Вверх
artsb
Дата 12.5.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Ого, что-то сложно ты написал. Для меня это тяжело. Можешь как-нибудь попроще объяснить на каком-нибудь примере. Тем более, сначала надо получить доступ к кнопке. Как это сделать?


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 12.5.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Дело в том, что при работе с common-контролами (ListView, TreeView, TabCtrl, Toolbar и др.) используется структура. Т.к. адрес структуры недействителен в другом процессе, структура должна принадлежать к адресному пространству процесса. По идее, это должно применяться ко всем контролам (Button, Static и др.), но MS это оставил для совместимости с Win16, а вот common-контролы изменять не стал.
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "ReBarWindow32", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "MSTaskSwWClass", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "ToolbarWindow32", NULL);
    if(!hWnd) {
        Caption = "Window not found";
        return;
    }

    DWORD pid;
    GetWindowThreadProcessId(hWnd, &pid);
    HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
    if(!hProcess) {
        Caption = GetLastError();
        return;
    }

    LPVOID pMem = VirtualAllocEx(hProcess, NULL, 1024 /*с запасом*/, MEM_COMMIT, PAGE_READWRITE);

    if(!pMem) {
        Caption = "Can't alocate memory";
        return;
    }

    TBBUTTONINFO tbi;
    tbi.cbSize = sizeof(TBBUTTONINFO);
    tbi.dwMask = TBIF_TEXT | TBIF_BYINDEX;
    tbi.pszText = (char*)((DWORD)pMem+sizeof(TBBUTTONINFO));  // строка будет записана после структуры
    tbi.cchText = 260;

    char buff[260];
    WriteProcessMemory(hProcess, pMem, &tbi, sizeof(tbi), NULL);
    SendMessage(hWnd, TB_GETBUTTONINFO, /*index*/1, (LPARAM)pMem);
    ReadProcessMemory(hProcess, (void*)((DWORD)pMem+sizeof(TBBUTTONINFO)), buff, 260, NULL);
    Label1->Caption = buff;

    VirtualFreeEx(hProcess, pMem, 1024, MEM_DECOMMIT);
    CloseHandle(hProcess);
}


Это сообщение отредактировал(а) 586 - 12.5.2008, 23:59
PM   Вверх
artsb
Дата 13.5.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586, спасибо. А где здесь скрыть/показать кнопку?

Это сообщение отредактировал(а) artsb - 13.5.2008, 16:30


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 14.5.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Всё намного проще:
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "ReBarWindow32", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "MSTaskSwWClass", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "ToolbarWindow32", NULL);
    if(!hWnd) {
        Caption = "Window not found";
        return;
    }

    long state = SendMessage(hWnd, TB_GETSTATE, /*index*/1, 0);
    //state |= TBSTATE_HIDDEN;    // скрыть
    //state &= ~TBSTATE_HIDDEN;   // показать
    state ^= TBSTATE_HIDDEN;

    SendMessage(hWnd, TB_SETSTATE, /*index*/1, state);
}


Добавлено через 10 минут и 9 секунд
А вот для TB_GETBUTTONTEXT придётся выделять память.
PM   Вверх
artsb
Дата 15.5.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586, спасибо. Приведённый вами код работает. Только вот не устраивает то, что нужно обращаться по индексу кнопки (есть ведь скрытые кнопки, которые трогать не нужно, а они отображаются smile).
Попробовал искать по надписи:
Код

    char *st=new char[256];
    SendMessage(hWnd,TB_GETBUTTONTEXT,1,(LPARAM)(LPSTR)st);
    ShowMessage(st);
    delete st;

Но в сообщении три закорючки и всё. Что я не так делаю? Вроде всё по справке:
Цитата

The TB_GETBUTTONTEXT message retrieves the text of a button in a toolbar. 

TB_GETBUTTONTEXT  
wParam = (WPARAM) idButton; 
lParam = (LPARAM) (LPSTR) lpszText; 
 

Parameters

idButton

Command identifier of the button whose text is to be retrieved. 

lpszText

Pointer to a buffer that receives the button text.



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 15.5.2008, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(586 @  14.5.2008,  20:57 Найти цитируемый пост)
А вот для TB_GETBUTTONTEXT придётся выделять память. 

Цитата(artsb @  15.5.2008,  22:46 Найти цитируемый пост)
char *st=new char[256];

В процессе нужно выделять память.
Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "ReBarWindow32", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "MSTaskSwWClass", NULL);
    hWnd = FindWindowEx(hWnd, NULL, "ToolbarWindow32", NULL);
    if(!hWnd) {
        Caption = "Window not found";
        return;
    }
    DWORD pid;
    GetWindowThreadProcessId(hWnd, &pid);
    HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, FALSE, pid);
    if(!hProcess) {
        Caption = GetLastError();
        return;
    }

    char buf[260];

    LPVOID pMem = VirtualAllocEx(hProcess, NULL, 260, MEM_COMMIT, PAGE_READWRITE);

    SendMessage(hWnd,TB_GETBUTTONTEXT,2,(LPARAM)pMem);
    ReadProcessMemory(hProcess, pMem,buf, 260, NULL);
    buf[259] = 0;  // buffer overflow protect
    Caption = buf;

    VirtualFreeEx(hProcess, pMem, 260, MEM_DECOMMIT);
    CloseHandle(hProcess);
}


Это сообщение отредактировал(а) 586 - 15.5.2008, 22:39
PM   Вверх
artsb
Дата 16.5.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Работает! 
586, респект вам. И ещё раз спасибо.

Где вы берёте эту информацию? Как её ищете? Если не секрет.
ЗЫ извиняюсь за офтоп.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
586
Дата 16.5.2008, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Цитата(artsb @  16.5.2008,  22:47 Найти цитируемый пост)
Где вы берёте эту информацию? Как её ищете? Если не секрет.

http://www.google.ru/  smile  smile 
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1224 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.