Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение стиля Edit'a 
:(
    Опции темы
kromol
Дата 12.6.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Здравствуйте, скажите, можна как-то определить текущий стиль Edit'а. Тоесть мне нужно узнать, установлен ли флаг ES_PASSWORD. Спасибо!
PM MAIL   Вверх
northener
Дата 12.6.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 20



GetWindowLong с флагом GWL_STYLE


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
kromol
Дата 12.6.2011, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Объясните пожалуйста, почему вот такой код работает в приложении, но неправильно работает в DLL.
Код

i: Integer;
Wnd: HWND;
......
i := GetWindowLong(Wnd, GWL_STYLE);
if (i xor ES_PASSWORD) > i then
  SendMessage(Wnd, EM_SETPASSWORDCHAR, $39, 0)
else
  SendMessage(Wnd, EM_SETPASSWORDCHAR, 0, 0);

PM MAIL   Вверх
northener
Дата 12.6.2011, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: нет
Всего: 20



Цитата(kromol @  12.6.2011,  02:21 Найти цитируемый пост)
Объясните пожалуйста, почему вот такой код работает в приложении, но неправильно работает в DLL

Простое объяснение - dll - это механизм не родной для дельфи.

Добавлено @ 03:01
Цитата(kromol @  12.6.2011,  02:21 Найти цитируемый пост)
i := GetWindowLong(Wnd, GWL_STYLE);
if (i xor ES_PASSWORD) > i then

А вот это, извините просто бред!

Это сообщение отредактировал(а) northener - 12.6.2011, 03:02


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
kromol
Дата 12.6.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Цитата(northener @  12.6.2011,  02:51 Найти цитируемый пост)
А вот это, извините просто бред!

А как правильно сделать проверку? Я только начинаю работать с АПИ. Хотя этот код работает правильно.


PM MAIL   Вверх
bems
Дата 12.6.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Если представить что мы не знаем что ES_PASSWORD это один бит, то так
(i and ES_PASSWORD) = ES_PASSWORD


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kromol
Дата 12.6.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Цитата(bems @  12.6.2011,  10:22 Найти цитируемый пост)
(i and ES_PASSWORD) = ES_PASSWORD

так тоже пробовал - не работает в DLL
и так не работает в DLL
Код

asm
   pushad;
   mov EAX, i;
   shr EAX, 6;
   push 0;
   jc @IS_PASSWORD;
   push $39;
   push EM_SETPASSWORDCHAR;
   push Wnd;
   call SendMessage;
   jmp @FINISH;
   @IS_PASSWORD:
   push 0;
   push EM_SETPASSWORDCHAR;
   push Wnd;
   call SendMessage;
   @FINISH:
   popad;
end;

в exe работает правильно
не пойму в чем проблема
PM MAIL   Вверх
bems
Дата 12.6.2011, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



GetWindowLong все равно в каком модуле. может ты неправильно wnd получаешь?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kromol
Дата 12.6.2011, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Без условия все правильно работает
Код

SendMessage(Wnd, EM_SETPASSWORDCHAR, 0, 0);

а с условием в dll постоянно 9 выдает,а  в exe переключает правильно
PM MAIL   Вверх
bems
Дата 12.6.2011, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



где 9 выдаёт?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kromol
Дата 12.6.2011, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



в Edit'е которому я шлю сообщение
PM MAIL   Вверх
kromol
Дата 13.6.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Возможно я что-то не так делаю. Вот весь код:
Код

var SysHook: HHOOK = 0;
    Wnd: HWND = 0;

function SysMsgProc(Code: Integer; wParam: Word; lParam: Longint): Longint; stdcall;
var State: TKeyboardState;
    i: Integer;
begin
  CallNextHookEx(SysHook, Code, wParam, lParam);
  if Code = HC_ACTION then
    begin
      Wnd := TMsg(Pointer(lParam)^).hwnd;
      if (TMsg(Pointer(lParam)^)).message = WM_LBUTTONDOWN then
        begin
          GetKeyboardState(State);
          if (State[VK_CONTROL] and 128) <> 0 then
            begin
              i := GetWindowLong(Wnd, GWL_STYLE);
              asm
                pushad;
                mov EAX, i;
                shr EAX, 6;
                push 0;
                jc @IS_PASSWORD;
                push $39;
                push EM_SETPASSWORDCHAR;
                push Wnd;
                call SendMessage;
                jmp @FINISH;
              @IS_PASSWORD:
                push 0;
                push EM_SETPASSWORDCHAR;
                push Wnd;
                call SendMessage;
              @FINISH:
                popad;
              end;
              InvalidateRect(Wnd, nil, true);
            end;
        end;
    end;
end;

procedure RunStopHook(State: Boolean); export; stdcall;
begin
  if State then
    SysHook := SetWindowsHookEx(WH_GETMESSAGE, @SysMsgProc, HInstance, 0)
  else
    begin
      UnhookWindowsHookEx(SysHook);
      SysHook := 0;
    end;
end;

PM MAIL   Вверх
kromol
Дата 19.6.2011, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 12.6.2011

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



Еще странно, что если вместо SendMessage просто выводить сообщение, то оно почему-то выводится два раза. 
Может кто-нибудь объяснить почему?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

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

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


 




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


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

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