Вниз
Скачать: CL | DM;

PostMessage   Найти похожие ветки 

← →
Боб   (2015-01-12 12:36) [0]

procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
 if (Msg.CmdType = WM_USER + 1) then
   MessageBox(Form1.Handle, "текст", "О программе", MB_ICONINFORMATION)
 else
   inherited;
end;


procedure TForm1.Label1Click(Sender: TObject);
begin
 PostMessage(Form1.Handle, WM_USER + 1, 0, 0);
end;


Нажимаю на Label1, но ничего не происходит. То же самое и с функцией SendMessage. Что тут не так?


← →
MBo ©   (2015-01-12 12:50) [1]

А как связан обработчик WMSysCommand с сообщением WM_USER + 1 ?

WM_SYSCOMMAND message

A window receives this message when the user chooses a command from the Window menu (formerly known as the system or control menu) or when the user chooses the maximize button, minimize button, restore button, or close button.


← →
Боб   (2015-01-12 13:18) [2]

 private
   procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND;


procedure TForm1.FormCreate(Sender: TObject);
 SysMenu := GetSystemMenu(Form1.Handle, False);
 AppendMenu(SysMenu, MF_SEPARATOR, 0, nil);
 AppendMenu(SysMenu, MF_ENABLED, WM_USER + 1, "О программе");


← →
кгшзх ©   (2015-01-12 13:24) [3]

const
WM_USER_MSG = WM_USER + 1;

procedure TForm1.OnUseerMessage(Msg : TMessage) message WM_USER_MSG;


← →
Боб   (2015-01-12 14:19) [4]

А что надо писать в procedure TForm1.OnUserMessage(var Msg: TMessage);. TMessage и TWMSysCommand несовместимы.


← →
Dimka Maslov ©   (2015-01-12 14:40) [5]

Метод-обработчик события должен иметь единственный аргумент (любого типа), передающийся по ссылке.


← →
Боб   (2015-01-12 15:41) [6]

Всё равно не пойму.


← →
MBo ©   (2015-01-12 16:36) [7]

Какая цель этого действа?
Если посылается PostMessage(Form1.Handle, WM_USER + 1, 0, 0), то принимать его можно, как и сказали, с помощью обработчика OnUserMessage(var Msg : TMessage) message WM_USER_MSG;
Если цель - принимать команду от системного меню, то и посылать нужно сообщение WM_SYSCOMMAND, правильно сформировав параметры WParam и LParam


← →
Боб   (2015-01-12 17:26) [8]

Цель - чтобы нажатие на Label1 было равносильно нажатию custom"ного пункта в системном меню окна. То есть клик по лейблу - и вызывается процедура TForm1.WMSysCommand(var Msg: TWMSysCommand);


← →
brother ©   (2015-01-12 17:29) [9]

когда это лейбол стал получать фокус ввода?


← →
Боб   (2015-01-12 18:52) [10]

Кликать на него можно и без фокуса.


← →
MBo ©   (2015-01-12 19:25) [11]

так попробовал посылать WM_SYSCOMMAND?


← →
Rouse_ ©   (2015-01-12 19:33) [12]

Удалено модератором
Примечание: Ну... тогда это лишнее :)


← →
Rouse_ ©   (2015-01-12 20:11) [13]

Опс - похоже я погорячился и мы работаем с системным меню :)
Тогда еще проще:
 SendMessage(Handle, WM_SYSCOMMAND, WM_USER + 1, 0);


← →
Боб   (2015-01-12 20:36) [14]

Rouse_, спасибо, код работает!



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.014 c
15-1445860992
DayGaykin
2015-10-26 15:03
2017.01.15
PHP и Java для Web


2-1419250635
Drowsy
2014-12-22 15:17
2017.01.15
Вопрос по TShellTreeView.


2-1427700274
aka
2015-03-30 10:24
2017.01.15
ускорение свободного падения


15-1457472602
Юрий
2016-03-09 00:30
2017.01.15
С днем рождения ! 9 марта 2016 среда


15-1452503308
Копир
2016-01-11 12:08
2017.01.15
Убить программиста.




   Наверх