WinCE, SetWindowsHookExW - не работает...

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

WinCE, SetWindowsHookExW - не работает...

Сообщение tria » 15.03.2010 15:16:21

Имеем код:
Код: Выделить всё
{$IfDef WinCE}
function KeyHook(CODE:longint; WParam:WPARAM; LParam:LPARAM):LRESULT; CDecl;
begin
  ShowMessage('h');
end;
{$Else}
function KeyHook(CODE:longint; WParam:WPARAM; LParam:LPARAM):LRESULT; StdCall;
begin
  ShowMessage('h');
end;
{$EndIf}

  Hook_APP:=SetWindowsHookExW(WH_KEYBOARD, @KeyHook, HInstance, 0);
  If Hook_APP=0 Then ShowMEssage('Hook_APP=0');


В Win32 работает, в WinCE - нет. Хук не ставится, Hook_APP равен нулю.
Может есть у кого-нить какие-то идеи?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение Timid » 15.03.2010 15:21:12

О! Вы пробились через вылетания?! В чем же было дело?
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение tria » 15.03.2010 15:29:53

Пробился - это не совсем то. Больше как в анекдоте - после посещения психолога писаться не перестал, но теперь это не имеет значения :)
сделал следующее:
Код: Выделить всё
Procedure TfmMain.OnGlobalExcept(Sender : TObject; E : Exception);
begin
  //Отловка глюка BITATEK IT8000
  If e.ClassType=EAccessViolation Then Exit
  Else Application.ShowException(E);
end;

При попытке выдвать сообщение об ошибке при e.ClassType=EAccessViolation программа вылетает. А так работаеть...

Достучался до поставщиков, ответили что при нажатии на кнопку Скан драйвер посылает след. сообщения:
Код: Выделить всё
PostMessage(HWND_BROADCAST, WM_KEYDOWN,SCAN_MESSAGE, 0);
PostMessage(HWND_BROADCAST, WM_APP, SCAN_KEYDOWN, 0);
PostMessage(HWND_BROADCAST, WM_KEYUP,SCAN_MESSAGE, 0);
PostMessage(HWND_BROADCAST, WM_APP, SCAN_KEYUP, 0);
#define SCAN_MESSAGE   0x1A
#define SCAN_KEYDOWN  0x1B 
#define SCAN_KEYUP   0x1C


Теперь хочу поставить хук, перехватить
PostMessage(HWND_BROADCAST, WM_KEYDOWN,SCAN_MESSAGE, 0);
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение v-t-l » 15.03.2010 17:08:06

Win32 Programmer's Reference писал(а):HWND_BROADCAST The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.

Если в этом WINCE не отличается от WIN32, при HWND_BROADCAST и так должны получить все окна.
То есть хук не нужен, нужны обработчики сообщений.
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение tria » 15.03.2010 17:16:47

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

Есть у меня следующее подозрение. Код из LCLtype - описание списка клавиш:
Код: Выделить всё
  VK_KANJI      = 25;
  VK_ESCAPE     = 27;

а #define SCAN_MESSAGE 0x1A=26
не это ли источник вылета?
Т.е. я хочу отловить сообщение с SCAN_MESSAGE и не давать отрабатывать его далее.

Добавлено спустя 21 час 4 минуты 1 секунду:
Перехватил событие:

Код: Выделить всё
Application.AddOnKeyDownBeforeHandler(@OnAppKeyDown);

procedure TfmMain.OnAppKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  If Key=26 Then begin
    Key:=0;
  end;
end;



А как перехватить событие KeyUp?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение Timid » 17.03.2010 23:45:59

Изврат какой-то :)
А почему не поставить обработчик сообщения. Т.е. сделать
Код: Выделить всё
private
    function WMKEYDOWN(var Key.....); message WM_KEYDOWN;


И затем вернуть Key:=0 в ответ на "плохие" коды?
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение tria » 18.03.2010 12:35:25

В приложении несколько форм. Ставить в каждой из них - некошерно...
Как вариант - делать свой TMyForm - предок для всех окон.

На текущий момент сделал следующее:
1.Application.AddOnKeyDownBeforeHandler(@OnAppKeyDown); - отлавливает кей даун для всего приложения, работает
здесь присваиваю Key=0 и дальше событие не идет...
2.procedure OnMessage_WM_APP(var Msg: TMessage); message WM_APP; - работает (для одной формы).
3.procedure OnKeyUp(var Message: TLMKeyUp); message WM_KEYUP; - не работает

Вылет происходит между (1) и (2).
Идеи закончились, решил пока просто не обращать внимание на вылеты.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение v-t-l » 18.03.2010 14:19:28

Может быть Application.AddOnUserInputHandler() или Application.OnUserInput поможет?
v-t-l
энтузиаст
 
Сообщения: 735
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение Timid » 18.03.2010 19:50:32

Такое пробовали?

Перехват всех сообщений до Application.onMessage (пример для Delphi):
Код: Выделить всё
program Project1;

uses
  Forms,
  Unit1 in 'UNIT1.PAS' { Form1 },
  Messages, WinTypes, WinProcs,

{$R *.RES}

var
  OldWndProc: TFarProc;

function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint):
  Longint; export;
begin
  { default WndProc return value }
  Result := 0;
  { handle messages here; the message number is in Msg }
  Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam);
end;

begin
  Application.CreateForm(TForm1, Form1);
  OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
  SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc));
  Application.Run;
end.
Timid
постоялец
 
Сообщения: 290
Зарегистрирован: 21.11.2007 21:33:15

Re: WinCE, SetWindowsHookExW - не работает...

Сообщение rPy3-200 » 15.10.2010 17:25:51

люди как дела? у меня похожая проблема
rPy3-200
новенький
 
Сообщения: 10
Зарегистрирован: 14.10.2010 15:44:11


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 60

Рейтинг@Mail.ru