скрыть кнопку с панели задач, сменить курсор в системе
Вопрос 1.
Можно ли скрыть кнопку с панели задач что бы при этом окно приложения осталось на экране ? То есть например: Запускаем калькулятор (calc.exe), выполняем какой-то код и после этого видим чистую панель задач, а окно калькулятора все также видно на экране.
Вопрос 2.
Вот например если щелкнуть мышью два раза на значке "Мой компьютер" то курсор на какое-то время изменится - вместо "курсора стрелки" будет виден "курсор стрелка+песочные часы". Я хочу чтобы, например, моя программа на определенное время подменяла системный курсор "стрелка+песочные часы" на курсор "стрелка". То есть чтобы потом я ,например, заходил в "Мой компьютер" и курсор не менял своего вида. Долго экспериментировал с функцией SetSystemCursor, писал примерно так SetSystemCursor(LoadCursor(0,IDC_WAIT),OCR_NORMAL);
Но желаемого результата не добился.
Помогите пожалуйста советом или куском кода (можно на си или паскале).
IDC_WAIT - песочные часы.
IDC_APPSTARTING - стрелка и маленькие песочные часы.
Ну а как нужно вызывать то ?
SetSystemCursor(LoadCursor(0,IDC_APPSTARTING),OCR_NORMAL) ;
??
Я уже по всякому делал, не работает :(
Код:
SetSystemCursor(LoadCursor(0,IDC_APPSTARTING),OCR_NORMAL);
Вы в какое место вставляете данный код? Ошибки возникают или нет?
Такая строчка SetSystemCursor(LoadCursor(0,IDC_APPSTARTING),OCR_NORMAL) тоже нормально работает у меня, но когда я пишу наоборот: SetSystemCursor(LoadCursor(0,IDC_ARROW),OCR_APPSTARTING); то есть хочу чтобы в системе вместо стандартного курсор-стрелка+песочные часы был назначен курсор-стрелка, ничего не получается. Код я вставляю в обработчик нажатия кнопки, ошибок не возникает.
По первому вопросу ITaskbarList и производные неплохо справятся. Можно попробовать подменять окну владельца, но не знаю как это выйдет с учетом кросс-процессности.
Код:
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);
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);
Да, спасибо, такой метод работает и это действительно то что мне нужно, вчера нашел подобный пример на Delphi, там небольшие отличия от этого.
Вот в этой строчке:
Цитата:
if (FindWindow(NULL, szText) == hWndMain) ShowWindow(hWndMain, SW_HIDE);
мне не совсем понятно про hWndMain, чей это хэндл ?
FAQ" слабо было заглянуть ? (55-й вопрос в особенности)
в прикрепленную тему с громким названием "
Не подходит 55 пункт из FAQ для решения моей проблемы. Мне нужно прятать кнопку чужого приложения на таскбаре.
Цитата: zxct
oxotnik333
Не подходит 55 пункт из FAQ для решения моей проблемы. Мне нужно прятать кнопку чужого приложения на таскбаре.
Не подходит 55 пункт из FAQ для решения моей проблемы. Мне нужно прятать кнопку чужого приложения на таскбаре.
дык в чем вопрос то? ищешь чужое окно, определяешь его хендл и с ним уже работаешь в соответствии с п. 55 FAQ-а
Цитата:
дык в чем вопрос то? ищешь чужое окно, определяешь его хендл и с ним уже работаешь в соответствии с п. 55 FAQ-а
Говорю же что не подходит. В п. 55 окно мы сами создаем и делаем его дочерним от пустого окна. А мне то другое надо совсем.
Цитата: zxct
мне не совсем понятно про hWndMain, чей это хэндл ?
того окна, кнопку которого на панели задач надо скрыть
Да спасибо, разобрался.
Я все еще жду ответы на мой второй вопрос про подмену курсора.
Цитата: 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);
SetSystemCursor(hcur, OCR_APPSTARTING);
Спасибо большое, теперь все ясно, разобрался.