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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2013, 20:11   #11
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
А как и результат SendMessage получить и не ждать бесконечно ответа от зависшего приложения?
SendMessageTimeout
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.01.2013, 22:19   #12
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Спасибо)

Если придется связаться с HWND_BROADCAST, то попробую не забыть.
Smogg вне форума Ответить с цитированием
Старый 29.01.2013, 08:02   #13
grandmixer
Пользователь
 
Аватар для grandmixer
 
Регистрация: 30.10.2012
Сообщений: 31
По умолчанию

ну например чтобы обнаружалась usb (самое распространенное в сети применение) нужно добавить
Код:
type
  PDevBroadcastHdr  = ^DEV_BROADCAST_HDR;
  DEV_BROADCAST_HDR = packed record
    dbch_size: DWORD;
    dbch_devicetype: DWORD;
    dbch_reserved: DWORD;
  end;

  PDevBroadcastDeviceInterface  = ^DEV_BROADCAST_DEVICEINTERFACE;
  DEV_BROADCAST_DEVICEINTERFACE = record
    dbcc_size: DWORD;
    dbcc_devicetype: DWORD;
    dbcc_reserved: DWORD;
    dbcc_classguid: TGUID;
    dbcc_name: short;
  end;

const
  GUID_DEVINTERFACE_USB_DEVICE: TGUID = '{A5DCBF10-6530-11D2-901F-00C04FB951ED}';
  DBT_DEVICEARRIVAL = $8000;
  DBT_DEVTYP_DEVICEINTERFACE = $00000005;

function USBreg:boolean;
var
  dbi:DEV_BROADCAST_DEVICEINTERFACE;
  size:Integer;
  r:pointer;
begin
  Result:=false;
  size:=SizeOf(DEV_BROADCAST_DEVICEINTERFACE);
  ZeroMemory(@dbi,size);
  dbi.dbcc_size:=size;
  dbi.dbcc_devicetype:=DBT_DEVTYP_DEVICEINTERFACE;
  dbi.dbcc_reserved:=0;
  dbi.dbcc_classguid:=GUID_DEVINTERFACE_USB_DEVICE;
  dbi.dbcc_name:=0;

  r:=RegisterDeviceNotification(FWh,@dbi,DEVICE_NOTIFY_WINDOW_HANDLE);
  if assigned(r) then result:=true;
end;
и сообщения о подключении устройства приходят потому что мы сами его посылаем нашему окну?(RegisterDeviceNotification(FW h,@dbi,DEVICE_NOTIFY_WINDOW_HANDLE) ;

Последний раз редактировалось grandmixer; 29.01.2013 в 08:09.
grandmixer вне форума Ответить с цитированием
Старый 29.01.2013, 08:49   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тут мы просим систему прислать нам уведомление.

броадкастные сообщения в общем то посылают только постом.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.01.2013, 09:06   #15
grandmixer
Пользователь
 
Аватар для grandmixer
 
Регистрация: 30.10.2012
Сообщений: 31
По умолчанию

ладно отойдем от устройств, а почему тогда нажатия кнопок не ловит?
grandmixer вне форума Ответить с цитированием
Старый 29.01.2013, 09:52   #16
grandmixer
Пользователь
 
Аватар для grandmixer
 
Регистрация: 30.10.2012
Сообщений: 31
По умолчанию

Ну как я понял:

Код:
//создаем невидимое окно где что то вроде таймера это WndProc
constructor mixer.Create;
begin
  inherited Create;
  FWh:=AllocateHwnd(WndProc);
end;

//обрабатываем сообщения
procedure mixer.WndProc(var Msg:TMessage);
begin
  if (msg.Msg = WM_LButtonDown) then //почему не работает?
  showmessage('press')
  else
  Msg.Result:=DefWindowProc(FWh,Msg.Msg,Msg.WParam,Msg.LParam);
end;

{создаем бесконечный цикл приема сообщений
можно сделать и 
while true do
getmessage(msg,0,0,0)
}
begin
  GrMix:=mixer.Create;
  while GetMessage(Msg,0, 0, 0) do //получаем сообщение в msg
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  GrMix.Destroy;
end.
grandmixer вне форума Ответить с цитированием
Старый 31.01.2013, 20:29   #17
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

потому что в структуре msg есть указание, в напрaвлении какого окна делается Dispatch().

Не уверен в синтаксисе, но будет как-то так:
Код:
begin
  GrMix:=mixer.Create;
  while GetMessage(Msg,0, 0, 0) do //получаем сообщение в msg
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
     
    msg.hwnd = mixer.hWnd;
    DispatchMessage(Msg);

  end;
  GrMix.Destroy;
end.
Smogg вне форума Ответить с цитированием
Старый 04.02.2013, 17:50   #18
grandmixer
Пользователь
 
Аватар для grandmixer
 
Регистрация: 30.10.2012
Сообщений: 31
По умолчанию

Сделал так но не получается а вроде все норм
begin
GrMix:=mixer.Create;
grmix.USBRegister;
while GetMessage(Msg,0, 0, 0) do //принимаем сообщение
begin
msg.hwnd:=grmix.fwh;//получателем делаем моё окно
TranslateMessage(msg);
DispatchMessage(msg);
end;
GrMix.Destroy;
end.
grandmixer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу разобраться с БД Wladimir33 Microsoft Office Access 7 02.11.2012 11:41
Не могу разобраться! romanov0303 C++ Builder 1 12.03.2012 10:48
не могу разобраться navolo4ka Qt и кроссплатформенное программирование С/С++ 3 03.02.2012 14:01
не могу разобраться Var17 Общие вопросы Delphi 6 27.03.2010 01:21
НЕ МОГУ РАЗОБРАТЬСЯ... GSV84 HTML и CSS 0 03.02.2010 01:38