Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Определение стиля Edit'a


Автор: kromol 12.6.2011, 00:28
Здравствуйте, скажите, можна как-то определить текущий стиль Edit'а. Тоесть мне нужно узнать, установлен ли флаг ES_PASSWORD. Спасибо!

Автор: northener 12.6.2011, 00:36
GetWindowLong с флагом GWL_STYLE

Автор: kromol 12.6.2011, 02:21
Объясните пожалуйста, почему вот такой код работает в приложении, но неправильно работает в 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);

Автор: northener 12.6.2011, 02:51
Цитата(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

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

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

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


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

Автор: kromol 12.6.2011, 10:47
Цитата(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 работает правильно
не пойму в чем проблема

Автор: bems 12.6.2011, 10:54
GetWindowLong все равно в каком модуле. может ты неправильно wnd получаешь?

Автор: kromol 12.6.2011, 11:12
Без условия все правильно работает
Код

SendMessage(Wnd, EM_SETPASSWORDCHAR, 0, 0);

а с условием в dll постоянно 9 выдает,а  в exe переключает правильно

Автор: bems 12.6.2011, 12:44
где 9 выдаёт?

Автор: kromol 12.6.2011, 13:44
в Edit'е которому я шлю сообщение

Автор: kromol 13.6.2011, 15:16
Возможно я что-то не так делаю. Вот весь код:
Код

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;

Автор: kromol 19.6.2011, 21:22
Еще странно, что если вместо SendMessage просто выводить сообщение, то оно почему-то выводится два раза. 
Может кто-нибудь объяснить почему?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)