Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

скрыть кнопку с панели задач, сменить курсор в системе

51K
18 октября 2009 года
zxct
9 / / 16.10.2009
Здравствуйте. У меня возникли две разные проблемы. Сам решить их не смог и поиск также не дал результата.

Вопрос 1.
Можно ли скрыть кнопку с панели задач что бы при этом окно приложения осталось на экране ? То есть например: Запускаем калькулятор (calc.exe), выполняем какой-то код и после этого видим чистую панель задач, а окно калькулятора все также видно на экране.

Вопрос 2.
Вот например если щелкнуть мышью два раза на значке "Мой компьютер" то курсор на какое-то время изменится - вместо "курсора стрелки" будет виден "курсор стрелка+песочные часы". Я хочу чтобы, например, моя программа на определенное время подменяла системный курсор "стрелка+песочные часы" на курсор "стрелка". То есть чтобы потом я ,например, заходил в "Мой компьютер" и курсор не менял своего вида. Долго экспериментировал с функцией SetSystemCursor, писал примерно так SetSystemCursor(LoadCursor(0,IDC_WAIT),OCR_NORMAL);
Но желаемого результата не добился.

Помогите пожалуйста советом или куском кода (можно на си или паскале).
297
18 октября 2009 года
koodeer
1.2K / / 02.05.2009
По второму вопросу:
IDC_WAIT - песочные часы.
IDC_APPSTARTING - стрелка и маленькие песочные часы.
51K
18 октября 2009 года
zxct
9 / / 16.10.2009
koodeer
Ну а как нужно вызывать то ?

SetSystemCursor(LoadCursor(0,IDC_APPSTARTING),OCR_NORMAL) ;

??

Я уже по всякому делал, не работает :(
297
19 октября 2009 года
koodeer
1.2K / / 02.05.2009
Хм... Вставил в свой код строку
 
Код:
SetSystemCursor(LoadCursor(0,IDC_APPSTARTING),OCR_NORMAL);
Прекрасно работает! В данный момент у меня в системе вместо стандартного курсора-стрелки - OCR_NORMAL - назначен курсор-стрелка+песочные часы - IDC_APPSTARTING.
Вы в какое место вставляете данный код? Ошибки возникают или нет?
51K
19 октября 2009 года
zxct
9 / / 16.10.2009
koodeer
Такая строчка SetSystemCursor(LoadCursor(0,IDC_APPSTARTING),OCR_NORMAL) тоже нормально работает у меня, но когда я пишу наоборот: SetSystemCursor(LoadCursor(0,IDC_ARROW),OCR_APPSTARTING); то есть хочу чтобы в системе вместо стандартного курсор-стрелка+песочные часы был назначен курсор-стрелка, ничего не получается. Код я вставляю в обработчик нажатия кнопки, ошибок не возникает.
14
19 октября 2009 года
Phodopus
3.3K / / 19.06.2008
По первому вопросу ITaskbarList и производные неплохо справятся. Можно попробовать подменять окну владельца, но не знаю как это выйдет с учетом кросс-процессности.
535
20 октября 2009 года
Нездешний
537 / / 17.01.2008
По первому вопросу можно еще как-нибудь так поизвращаться:
Код:
HWND hWndTaskbar = FindWindow("Shell_TrayWnd", NULL);
hWndTaskbar = FindWindowEx(hWndTaskbar, NULL, "ReBarWindow32", NULL);
hWndTaskbar = FindWindowEx(hWndTaskbar, NULL, "MSTaskSwWClass", NULL);
hWndTaskbar = FindWindowEx(hWndTaskbar, NULL, "ToolbarWindow32", NULL);

DWORD dwProcessId;
GetWindowThreadProcessId(hWndTaskbar, &dwProcessId);
HANDLE h = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId);

char **lp = (LPSTR*)VirtualAllocEx(h, NULL, TextLen, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

int ButtonCount = SendMessage(hWndTaskbar, TB_BUTTONCOUNT, 0, 0);

int TextLen = 200;
char *szText = new char[TextLen];

for (int i = 0; i < ButtonCount; i++)
{
     memset(szText, 0, TextLen);
     SendMessage(hWndTaskbar, TB_GETBUTTONTEXT, i, (LPARAM)lp);
     ReadProcessMemory(h, (LPVOID)lp, szText, TextLen, 0);

     if (FindWindow(NULL, szText) == hWndMain)  ShowWindow(hWndMain, SW_HIDE);  
}

delete[] szText;
VirtualFreeEx(h, lp, 0, MEM_RELEASE);
CloseHandle(h);
51K
20 октября 2009 года
zxct
9 / / 16.10.2009
Нездешний

Да, спасибо, такой метод работает и это действительно то что мне нужно, вчера нашел подобный пример на Delphi, там небольшие отличия от этого.

Вот в этой строчке:
Цитата:
if (FindWindow(NULL, szText) == hWndMain) ShowWindow(hWndMain, SW_HIDE);


мне не совсем понятно про hWndMain, чей это хэндл ?

11
20 октября 2009 года
oxotnik333
2.9K / / 03.08.2007
в прикрепленную тему с громким названием "FAQ" слабо было заглянуть ? (55-й вопрос в особенности)
51K
20 октября 2009 года
zxct
9 / / 16.10.2009
oxotnik333
Не подходит 55 пункт из FAQ для решения моей проблемы. Мне нужно прятать кнопку чужого приложения на таскбаре.
11
20 октября 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: zxct
oxotnik333
Не подходит 55 пункт из FAQ для решения моей проблемы. Мне нужно прятать кнопку чужого приложения на таскбаре.


дык в чем вопрос то? ищешь чужое окно, определяешь его хендл и с ним уже работаешь в соответствии с п. 55 FAQ-а

51K
20 октября 2009 года
zxct
9 / / 16.10.2009
oxotnik333
Цитата:
дык в чем вопрос то? ищешь чужое окно, определяешь его хендл и с ним уже работаешь в соответствии с п. 55 FAQ-а



Говорю же что не подходит. В п. 55 окно мы сами создаем и делаем его дочерним от пустого окна. А мне то другое надо совсем.

535
21 октября 2009 года
Нездешний
537 / / 17.01.2008
Цитата: zxct
мне не совсем понятно про hWndMain, чей это хэндл ?

того окна, кнопку которого на панели задач надо скрыть

51K
21 октября 2009 года
zxct
9 / / 16.10.2009
Нездешний
Да спасибо, разобрался.

Я все еще жду ответы на мой второй вопрос про подмену курсора.
297
21 октября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: zxct
Я все еще жду ответы на мой второй вопрос про подмену курсора.


[QUOTE=MSDN]The SetSystemCursor function enables an application to customize the system cursors. It replaces the contents of the system cursor specified by the id parameter with the contents of the cursor specified by the hcur parameter and then destroys hcur.[/QUOTE]
Исходя из этого, ясно, что после выполнения функции

 
Код:
SetSystemCursor(LoadCursor(0,IDC_ARROW),OCR_APPSTARTING);
бывшее значение обычного курсора разрушается.
[QUOTE=MSDN]The system destroys hcur by calling the DestroyCursor function. Therefore, hcur cannot be a cursor loaded using the LoadCursor function. To specify a cursor loaded from a resource, copy the cursor using the CopyCursor function, then pass the copy to SetSystemCursor.[/QUOTE]
В итоге получаем:
 
Код:
HCURSOR hcur = CopyCursor(LoadCursor(0,IDC_ARROW));
SetSystemCursor(hcur, OCR_APPSTARTING);
51K
22 октября 2009 года
zxct
9 / / 16.10.2009
koodeer
Спасибо большое, теперь все ясно, разобрался.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог