Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.10.2014, 22:28
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию обработка сообщения

отлавливаю сообщение формы следующим способом
Код:
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall;
begin
//тут код
end;
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
end;
так вот, после того как получил сообщение обрабатываю и выполняю действия, но, сообщение отлавливается только 1 раз 2 раз уже игнорируется. Пришла идея загнать в таймер и уже повторять проверку? как правильно это реализовать в таймере. Как запустить данную функцию в таймер? или может кто скажет как сделать чтобы сообщение обрабатывалась постоянно, а не 1 раз после запуска.
Ответить с цитированием
  #2  
Старый 31.10.2014, 11:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от HTTqp
...как сделать чтобы сообщение обрабатывалась постоянно, а не 1 раз после запуска.
Вероятно здесь поможет мейджикворд inherited...
Ответить с цитированием
  #3  
Старый 31.10.2014, 18:04
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от Alegun
Вероятно здесь поможет мейджикворд inherited...
а как его применить, пробую так но ошибка
Код:
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall;
begin
Result:=0;
case msg of
  WM_DESTROY:
   begin
    PostQuitMessage(0);
    Exit;
   end;
//тут еще сообщения которые отлавливаются
//...
//...
end;
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
inherited;
end;

ошибка связана как я понял что-то на до было добавить в TYPE, класс что ли, но форма то api'ишная как что прописать в type?
this form of method call only allowed in methods of derived types

Последний раз редактировалось HTTqp, 31.10.2014 в 18:07.
Ответить с цитированием
  #4  
Старый 01.11.2014, 07:27
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Тогда инхирайт здесь не нужен. Блок обработки сообщений у "чисто" апишной формы (по drkb) должен выглядеть примерно так
Код:
function WindowProc(hWnd,Msg,wParam,lParam: Longint): Longint; stdcall; export;
begin
//подпрограмма обработки сообщений
case Msg of
   WM_DESTROY: begin
     PostQuitMessage(0);
     Exit;
   end;

//тут еще сообщения которые отлавливаются
//...
//...

   else
      Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
end;
нужна инициализация этой функции при регистрации класса формы
Код:
...
var
wcx: TWndClass;

...

// адрес оконной процедуры
   wcx.lpfnWndProc := @WindowProc;
...
а в основном теле проги ставится такой блок

Код:
...
var
AMessage: msg;

...

   while (GetMessage(AMessage, 0, 0, 0)) do
   begin
     //Запускаем цикл обработки сообщений
     TranslateMessage(AMessage);
     DispatchMessage(AMessage);
   end;
...
Ответить с цитированием
  #5  
Старый 02.11.2014, 07:33
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от HTTqp
отлавливаю сообщение формы следующим способом
Код:
function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall;
begin
//тут код
end;
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
end;
все-таки окна или формы? есть разница.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 02.11.2014, 20:30
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Программу пишу на чистом api значит и форма создается с использованием api, проблема только вот в чем некоторые сообщения отлавливаются 1 раз, после запуска как только форма потеряла фокус все они не обрабатываются, сначала думал надо сделать через таймер, но бесполезно наверное, форма то вне фокуса. Так вот почитал можно сделать форму поплавок, то есть пока программа открыта пользователь работает только с ней, как он заканчивает тогда все программу закрывает ее и все. Как реализовать тогда форму поплавок, потому что например у меня игры перекрывают ее.
Ответить с цитированием
  #7  
Старый 02.11.2014, 21:05
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

формы в VCL, там - окна. вызывай DefWindowProc внутри оконной процедуры, для необрабатываемых сообщений! пример работающей процедуры:

Код:
function WindowProc(AWnd: HWND; Msg: Integer;
  wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
  case Msg of
    WM_CLOSE: begin
      PostQuitMessage(0);
      Result:=0;
    end;
    else Result:=DefWindowProc(AWnd, Msg, wParam, lParam);
  end
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 03.11.2014, 01:18
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

Цитата:
Сообщение от NumLock
формы в VCL, там - окна. вызывай DefWindowProc внутри оконной процедуры, для необрабатываемых сообщений! пример работающей процедуры:

Код:
function WindowProc(AWnd: HWND; Msg: Integer;
  wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
  case Msg of
    WM_CLOSE: begin
      PostQuitMessage(0);
      Result:=0;
    end;
    else Result:=DefWindowProc(AWnd, Msg, wParam, lParam);
  end
end;
Вот малая часть и так сказать основная, просто я не понял про форму VLC начали говорить.
Код:
program Project1;

uses
  Windows,
  Messages;

const
  WindowWidth=600;
  WindowHeight=400;

var
  HM: THandle;
  Msg: TMsg;
  wc: TWndClass;
  hWindow: HWND;

function WindowProc(hWnd,Msg,wParam,lParam:Integer):Integer;stdcall;
var
  PS: TPaintStruct;
begin
Result:=0;
case msg of
  WM_DESTROY:
   begin
    PostQuitMessage(0);
    Exit;
   end;
end;
Result:=DefWindowProc(hWnd,Msg,wParam,lParam);
end;

//Процедура создания окна
procedure CreateMain;
begin
FillChar(wc,SizeOf(TWndClassEx), 0);
wc.lpszClassName:='MainForm';//Название имени класса окна
wc.lpfnWndProc:=@WindowProc;
wc.hbrBackground:=COLOR_WINDOW;//Цвет формы
wc.hIcon:=LoadIcon(hInstance,MakeIntResource('MAINICON'));{тут мы подгрузим дефолтную иконку делфи}
wc.hCursor:=LoadCursor(0,IDC_ARROW);{Выставим курсор по умолчаннию}
RegisterClass(wc);{Регистрируем класс}

CreateWindowEx(WS_EX_CONTROLPARENT,{Поверхи всех окон}
               wc.lpszClassName,{Имя класса окна}
               'Window'{Имя окна},
               WS_TILEDWINDOW or WS_VISIBLE{Стиль окна or Видимое окно},
               300,100,WindowWidth,WindowHeight,
               0,0,
               hInstance,{Описатель приложения, с которым окно связывается}
               nil);
ShowWindow(hWindow,SW_SHOW);
UpDateWindow(hWindow);
end;

begin
CreateMain;
while GetMessage(Msg,0,0,0) do
 begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
 end;
end.
Вот я создал форму. в function WindowProc я произвожу обработку нажатий button, работу с формой и т.п. но проблема некоторые сообшения не приходят, потому что форма теряет фокус, либо они срабатывают один раз, как мне зделать чтобы окно было постоянно впереди, не теряя фокуса.
Ответить с цитированием
  #9  
Старый 03.11.2014, 09:16
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

нет там никаких кнопок, ни их обработки! вот тут есть:

Код:
program CreateWindowAPI;

uses
  Windows, Messages;

var
  AWndClass: WNDCLASS;
  AMsg: TMsg;
  AWnd: HWND;

function WindowProc(hwnd: HWND; uMsg: UINT;
  wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
  Result:=0;
  case uMsg of
    WM_COMMAND: begin
      if HIWORD(wParam)=0 then
      case LOWORD(wParam) of
        2014: MessageBox(hwnd, 'Button1', 'TWINAPIFORM', MB_OK);
        2015: MessageBox(hwnd, 'Button2', 'TWINAPIFORM', MB_OK);
      end;
    end;
    WM_CLOSE: if MessageBox(hwnd, 'Close?', 'TWINAPIFORM', MB_OKCANCEL)=IDOK then PostQuitMessage(0) else Exit;
  end;
  Result:=DefWindowProc(hwnd, uMsg, wParam, lParam);
end;

begin
  AWndClass.Style:=CS_HREDRAW or CS_VREDRAW;
  AWndClass.lpfnWndProc:=@WindowProc;
  AWndClass.cbClsExtra:=0;
  AWndClass.cbWndExtra:=0;
  AWndClass.hInstance:=HInstance;
  AWndClass.hIcon:=LoadIcon(0, IDI_APPLICATION);
  AWndClass.hCursor:=LoadCursor(0, IDC_ARROW);
  AWndClass.hbrBackground:=COLOR_WINDOW+1;
  AWndClass.lpszMenuName:=nil;
  AWndClass.lpszClassName:='TWINAPIFORM';
  RegisterClass(AWndClass);
  AWnd:=CreateWindow(
    AWndClass.lpszClassName,
    AWndClass.lpszClassName,
    WS_VISIBLE or WS_OVERLAPPEDWINDOW,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
    640, 480, 0, 0,
    HInstance, nil);
  CreateWindow('BUTTON', 'Button1', WS_CHILDWINDOW or WS_VISIBLE,
    10, 10, 75, 25, AWnd, 2014, HInstance, nil);
  CreateWindow('BUTTON', 'Button2', WS_CHILDWINDOW or WS_VISIBLE,
    10, 45, 75, 25, AWnd, 2015, HInstance, nil);
  while GetMessage(AMsg, 0, 0, 0) do
  begin
    TranslateMessage(AMsg);
    DispatchMessage(AMsg);
  end;
end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 03.11.2014, 18:09
HTTqp HTTqp вне форума
Новичок
 
Регистрация: 16.04.2014
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: -25
По умолчанию

NumLock, вопрос не в том как обрабботать кнопку, это я знаю. Вопрос в другом как обработать потерю фокуса и сделать форму-поплавок, ну или чтобы она всегда была активна(в фокусе).
Ответить с цитированием
  #11  
Старый 03.11.2014, 20:12
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

пиши сразу что нужно!
Цитата:
The WM_ACTIVATE message is sent when a window is being activated or deactivated.
Код:
BOOL SetForegroundWindow(
    HWND hWnd 	// handle of window to bring to foreground
   );
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:58.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025