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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Message.wParam равен VK_BACKSPACE - клавиша, которую не нажимают порождает сообщение? 
:(
    Опции темы
malor
  Дата 9.8.2011, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Есть простейшая программа - форма, на ней TImage  и таймер. запускаю ее и начинаю на клаве набивать символы, хаотично, иногда цифры, Enter, Alt+Shift, пробел, вобщем, кнопки на основном участке клавиатуры. 
В какой-то момент в программа останавливается на breakpoint'е:
user posted image

8 - это виртуальный код клавиши BackSpace. Но я её не жму! Откуда он взялся?

user posted image

Вот как лог выглядит:
Цитата
.................etc ........................
wParam: 68 lParam: 2097153
wParam: 70 lParam: 2162689
wParam: 68 lParam: -1071644671
wParam: 83 lParam: -1071710207
wParam: 70 lParam: -1071579135
wParam: 13 lParam: 1073741825
wParam: 13 lParam: -2145648639
wParam: 83 lParam: 2031617
wParam: 70 lParam: 2162689
wParam: 8 lParam: 1
wParam: 8 lParam: -1073741823
wParam: 8 lParam: 1
wParam: 8 lParam: -1073741823
wParam: 83 lParam: 1073741825
wParam: 83 lParam: -1073741823
wParam: 70 lParam: 1073741825
wParam: 70 lParam: -1073741823
wParam: 83 lParam: -2145452031
................etc .........................


Код

procedure TMainForm.Wndproc(var Message: TMessage);
var
    strLog: AnsiString;
begin

  case Message.Msg of
    WM_KEYDOWN, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_KEYUP:

    begin
      strLog := 'wParam: ' + IntToStr(Message.wParam) + ' lParam: ' + IntToStr(Message.lParam);
    end;

  else
    inherited;
  end;

end;


Delphi XE

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  WorkBS.zip 140,46 Kb
PM MAIL   Вверх
kovalеv
Дата 10.10.2012, 01:11 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Скорее всего, косяк Delphi. Вот код, все работает:

Код

program Example;

uses
  Windows, Messages;

var
  WC: TWndClass;
  Msg: TMsg;
  Win, Memo1, Button1: HWND;
  Font1: HFONT;

procedure KeyCode(WP, LP: Integer);
var
  strLog, S1, S2: AnsiString;
  P: PChar;
begin
  Str(WP, S1);
  Str(LP, S2);
  strLog := 'wParam: ' + S1 + ',      ' + ' lParam: ' + S2;
  SendMessage(Win, WM_SETTEXT, 0, Integer(strLog));
  GetMem(P, 32*1024);
    GetWindowText(Memo1, P, 32*1024);
    Move(#13#10, PChar(Integer(P) + Length(P))^, 2);
    GetWindowText(Win, PChar(Integer(P + Length(P))), 32*1024);
    SetWindowText(Memo1, p);
    while (LOWORD(SendMessage(Memo1, EM_SCROLL, SB_PAGEDOWN,0))<> 0) do;
  FreeMem(P);
end;

function WindowProc(Win, Msg, WP, LP: Integer): Integer; stdcall;
begin
  if Msg = WM_DESTROY then
    PostQuitMessage(0);
  Result := DefWindowProc(Win, Msg, WP, LP)
end;

function MessageFilter(var Msg: TMsg): Boolean;
var
  s: string;
begin
  Result := True;
  s := '';
  if (Msg.hwnd = Memo1) and (Msg.message = WM_LBUTTONUP) then
    SetFocus(Button1);
  if ((Msg.hwnd = Button1) or (Msg.hwnd = Win)) and
    ((Msg.message = WM_KEYDOWN) or (Msg.message = WM_KEYUP)) or
    ((Msg.message = WM_SYSKEYDOWN) or (Msg.message = WM_KEYUP)) then
      KeyCode(Msg.wParam, Msg.lParam)
end;


BEGIN
  with WC do
  begin
    lpszClassName:= 'asd';
    lpfnWndProc :=  @WindowProc;
    hbrBackground := 1;
    hCursor := LoadCursor(0, IDC_ARROW)
  end;
  RegisterClass(WC);

  Win := CreateWindow(WC.lpszClassName, 'Заголовок программы',
    WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX or WS_VISIBLE,
    400, 200, 350, 600, 0, 0, hInstance, nil);

  Font1 := GetStockObject(ANSI_VAR_FONT);
  
  Memo1 := CreateWindowEx(WS_EX_STATICEDGE, 'Edit', '',
    WS_VISIBLE or WS_CHILD or WS_VSCROLL or ES_MULTILINE,
    5, 5, 335, 540, Win, 1001, hInstance, nil);
  SendMessage(Memo1, WM_SETFONT, Font1, 0);

  Button1 := CreateWindowEx(WS_EX_STATICEDGE, 'Button', 'Кнопка',
    WS_VISIBLE or WS_CHILD, 275, 550, 66, 20, Win, 1002, hInstance, nil);
  SendMessage(Button1, WM_SETFONT, Font1, 0);

  while GetMessage(Msg, 0, 0, 0) do
  if MessageFilter(Msg) then
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg)
  end;
END.


user posted image


 

Это сообщение отредактировал(а) kovalеv - 10.10.2012, 01:15
PM   Вверх
malor
  Дата 10.10.2012, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Там была причина в "Punto Switcher".  smile 
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.

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


 




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


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

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