Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2011, 00:03   #1
Genco
Пользователь
 
Аватар для Genco
 
Регистрация: 16.11.2010
Сообщений: 46
По умолчанию Изменение стиля чужого окна. Не возвращается назад.

Здравствуйте! Кажется,у меня небольшие проблемы с битовой алгеброй. Дело вот в чем: я поставил глобальный хук на мышь классическим способом из dll, в тренировочных целях (сама задумка сложнее, оттачиваю механизм) пробую добавить/удалить свойство CS_NOCLOSE в/из стиль произвольного окна. В функции - обработчике пишут следующее :
Код:
function MouseHook(nCode, wParam, lParam: integer): Lresult; stdcall;
var
  msg: PMouseHookStruct;
  w: HWND;
  style: UINT;
begin
  if nCode < 0 then
  begin
    result := CallNextHookEx(msHook, nCode, wParam, lParam);
    exit;
  end;
  msg := PMouseHookStruct(lParam);

  case wParam of

    WM_MBUTTONDOWN : pt := msg^.pt;
    WM_MBUTTONUP :
    begin
      w := WindowFromPoint(pt);
      style:=GetWindowLong(w,GWL_STYLE);
      if (style and CS_NOCLOSE = CS_NOCLOSE) then
       begin
        style:=style xor CS_NOCLOSE;
        SetWindowLong(w,GWL_STYLE,style);
        SetWindowPos(w, 0, 0,0,0,0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER);
       end
      else
       begin
        style:=style or CS_NOCLOSE;
        SetWindowLong(w,GWL_STYLE,style);
        SetWindowPos(w, 0, 0,0,0,0, SWP_FRAMECHANGED or SWP_NOMOVE or SWP_NOSIZE or SWP_NOZORDER );
       end;

    end;
  end;

  result := CallNextHookEx(msHook, nCode, wParam, lParam);
end;
Должен вкл/выкл крестик по идее... Про то,что не все окна сразу реагируют на win 7 (криво,через раз) я молчу, но главное - то, что в одну сторну стиль меняется (правда пропадает у окна рамка,вся "шапка" и оно перестает отвечать на сообщения совсем), а обратно - никак, просто умирает. По идее я просто добавляю/убираю флаг из стиля, после чего вызываю функцию обновления. Всё как в MSDN сказано.
Либо я неправильно помню битовую алгебру, либо окно перестает совсем ловить сообщения, потому так плохо.
Помогите, пожалуйста, разобраться.
Бложегов не имею, но найти меня можно в уютном междусобойчике тут: http://coverduck.ru
"Форум программистов, анархистов, анонимусов и просто любителей с интересом пообщаться"

Последний раз редактировалось Genco; 02.03.2011 в 00:54. Причина: xor и or поправил, суть та же
Genco вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Проблема] Программное изменение заголовка чужого окна по хендлу процесс(EnumWindows) Человек_Борща Общие вопросы Delphi 8 08.01.2011 22:40
Изменение стиля линии графика! 4ika Общие вопросы C/C++ 2 04.05.2010 21:37
Изменение стиля линии графика! 4ika Общие вопросы C/C++ 0 04.05.2010 20:16
Сворачивание чужого окна artemavd Общие вопросы Delphi 2 27.04.2010 07:45
VirtualStringTree чужого окна akaTemporary Общие вопросы Delphi 0 29.01.2010 14:32