C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запретить всплывающее меню, (зная hwnd чужого окна)
Admin
Отправлено: 11.11.2003, 16:26


Владимир

Группа: Администратор
Сообщений: 1190



Есть чужое окно — панель внизу рабочего стола (с кнопкой "Пуск")
Необходимо запретить всплавающее меню по нажатию правой
кнопкой мыши, причем минимизированные приложения
должны остаться и трей с часами тоже, и они должны быть
доступны.

Handle окна известно:
hWnd = FindWindow("Shell_TrayWnd", NULL);

То есть — как зная Handle окна запретить для него
всплывающее меню (popup-menu)
xTrim
Отправлено: 11.11.2003, 17:01


Машинист паровоза

Группа: Участник
Сообщений: 208



Проще помоему изменить
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\NoTrayContextMenu (reg_dword)(1)
или Вам нужно именно по хэндлу?
Admin
Отправлено: 11.11.2003, 18:38


Владимир

Группа: Администратор
Сообщений: 1190



У меня в Windows2000 там такого ключа нет
(NoTrayContextMenu)
желательно по хэндлу.
Admin
Отправлено: 12.11.2003, 09:50


Владимир

Группа: Администратор
Сообщений: 1190



Спасибо, xTrim biggrin.gif
Именно то, что мне и нужно было, прописал
это значение — меню исчезло, как и надо было.

CODE

const char *RegKey = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer";

bool isNotReg = false;

TRegistry* Reg = new TRegistry;
Reg->RootKey = HKEY_CURRENT_USER;

Reg->OpenKey(RegKey, false);
if(Reg->ValueExists("NoTrayContextMenu")){
int sr = Reg->ReadInteger("NoTrayContextMenu");
if(sr != 1) isNotReg = true;
}else isNotReg = true;

if(isNotReg){
Reg->CloseKey();
Reg->RootKey = HKEY_CURRENT_USER;
Reg->OpenKey(RegKey, true);
Reg->WriteInteger("NoTrayContextMenu",1);
Reg->CloseKey();
}
delete Reg;
if(isNotReg) // перезагрузить комп, чтоб изменения вступили в силу
ARebootExecute(Sender);



Был еще вариант разобраться с этим меню через хук,

CODE

HWINEVENTHOOK wHook = NULL;
// PopupMenu
VOID CALLBACK WinEventProc(
 HWINEVENTHOOK hWinEventHook,
 DWORD event,
 HWND hwnd,
 LONG idObject,
 LONG idChild,
 DWORD dwEventThread,
 DWORD dwmsEventTime )
{
 if(!hwnd)return;
 if(event==EVENT_SYSTEM_MENUPOPUPSTART) ShowWindow(hwnd, SW_HIDE);
}

void __fastcall TFMain::SpeedButton1Click(TObject *Sender)
{
 if(wHook)UnhookWinEvent(wHook);
 wHook=NULL;

 wHook=SetWinEventHook(
           EVENT_SYSTEM_MENUPOPUPSTART,
           EVENT_SYSTEM_MENUPOPUPSTART,
       //    EVENT_SYSTEM_MENUPOPUPEND,
           NULL, (WINEVENTPROC)WinEventProc,
           0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
}
//---------------------------------------------------------------------------

void __fastcall TFMain::SpeedButton2Click(TObject *Sender)
{
  if(wHook)UnhookWinEvent(wHook); wHook=NULL;
}
//---------------------------------------------------------------------------

void __fastcall TFMain::FormDestroy(TObject *Sender)
{
 if(wHook) UnhookWinEvent(wHook); wHook=NULL;
}
//----------------------------------------------------


скрывать меню, как только оно появляется,
но это не то что мне надо было.

Через реестр — Ок.

Отредактировано Admin — 12/11/2003, 10:53

Вернуться в Вопросы программирования в C++Builder