Delph 两个对立程序使用消息进行控制通信
2017-03-21 13:02
323 查看
在实际应用中,总是会遇到两个独立的程序进行通信,其实通信的方式有好几种,比如进程间通信,消息通信。
项目中用到了此功能, 此功能用于锁屏程序, 下面把实现的流程和大家分享一下。
1. 在锁屏程序中,自定一个消息,如下
//注册消息的句柄
FIMessage: Integer;
FIMessage:= RegisterWindowMessage('LockDeskMessage');
2. 如果输入正确的截屏密码, 则触发广播消息,同时关闭锁屏窗体, 同时通过注册的缓存中的另一个程序的handle,广播消息,代码如下
var
h1: HWND;
begin
if (trim(edit1.Text) <> pwd) then
application.messagebox('对不起,不能打开锁。请确定你输入了密码并且输入的密码正确!', '提示', mb_ok + mb_iconinformation)
else
begin
h1:= FindWindow('Tfrm_MainIPC',PChar(FMainCaption));
PostMessage(h1,FIMessage,0,1);
ok := true;
frm_lockdesk.close;
end;
end;
3.另一个程序在程序启动的开始,注册消息, 代码如下
//调用锁屏消息
FJLockDeskMessage: Cardinal;
FJLockDeskMessage := RegisterWindowMessage('LockDeskMessage');
4.监听消息,覆盖不停监听消息的函数, 实现代码如下
procedure WndProc(var Message: TMessage); override;
procedure Tfrm_MainIPC.WndProc(var Message: TMessage);
begin
if Message.Msg = FJLockDeskMessage then
begin
iTimers_MainIPC.Enabled6 := True;
ToolBar1.Enabled := True;
end
else
begin
inherited;
end;
end;
在此消息中实现该实现的功能。
触发的方法
procedure Tfrm_MainIPC.iTimers_MainIPCTimer6(Sender: TObject);
var
sFileName_lock: string;
begin
//当运行环境不为C盘时说明是开发调试环境,不启动铴屏
// if LowerCase(Copy(Application.ExeName, 1, 1)) <> 'c' then
// exit;
if G_SaveDebug then exit;
FFlag := FFlag + 1;
if FFlag >= 2 then //100
begin
FFlag :=0 ;
if not wdRunOnce.findProcess('LockScreen.exe') then
begin
logThreadManager(ltInformation, 'B65D30A5-AA25-40B4-A801-FA647D011AFF 启动锁屏程序。');
sFileName_lock := ExtractFilePath(Application.ExeName) + 'LockScreen.exe';
if FileExists(sFileName_lock) then
begin
ToolBar1.Enabled := False;
WinExec(PAnsiChar(sFileName_lock),SW_SHOW);
iTimers_MainIPC.Enabled6 := False;
//Application.ProcessMessages;
end;
end;
end;
end;
项目中用到了此功能, 此功能用于锁屏程序, 下面把实现的流程和大家分享一下。
1. 在锁屏程序中,自定一个消息,如下
//注册消息的句柄
FIMessage: Integer;
FIMessage:= RegisterWindowMessage('LockDeskMessage');
2. 如果输入正确的截屏密码, 则触发广播消息,同时关闭锁屏窗体, 同时通过注册的缓存中的另一个程序的handle,广播消息,代码如下
var
h1: HWND;
begin
if (trim(edit1.Text) <> pwd) then
application.messagebox('对不起,不能打开锁。请确定你输入了密码并且输入的密码正确!', '提示', mb_ok + mb_iconinformation)
else
begin
h1:= FindWindow('Tfrm_MainIPC',PChar(FMainCaption));
PostMessage(h1,FIMessage,0,1);
ok := true;
frm_lockdesk.close;
end;
end;
3.另一个程序在程序启动的开始,注册消息, 代码如下
//调用锁屏消息
FJLockDeskMessage: Cardinal;
FJLockDeskMessage := RegisterWindowMessage('LockDeskMessage');
4.监听消息,覆盖不停监听消息的函数, 实现代码如下
procedure WndProc(var Message: TMessage); override;
procedure Tfrm_MainIPC.WndProc(var Message: TMessage);
begin
if Message.Msg = FJLockDeskMessage then
begin
iTimers_MainIPC.Enabled6 := True;
ToolBar1.Enabled := True;
end
else
begin
inherited;
end;
end;
在此消息中实现该实现的功能。
触发的方法
procedure Tfrm_MainIPC.iTimers_MainIPCTimer6(Sender: TObject);
var
sFileName_lock: string;
begin
//当运行环境不为C盘时说明是开发调试环境,不启动铴屏
// if LowerCase(Copy(Application.ExeName, 1, 1)) <> 'c' then
// exit;
if G_SaveDebug then exit;
FFlag := FFlag + 1;
if FFlag >= 2 then //100
begin
FFlag :=0 ;
if not wdRunOnce.findProcess('LockScreen.exe') then
begin
logThreadManager(ltInformation, 'B65D30A5-AA25-40B4-A801-FA647D011AFF 启动锁屏程序。');
sFileName_lock := ExtractFilePath(Application.ExeName) + 'LockScreen.exe';
if FileExists(sFileName_lock) then
begin
ToolBar1.Enabled := False;
WinExec(PAnsiChar(sFileName_lock),SW_SHOW);
iTimers_MainIPC.Enabled6 := False;
//Application.ProcessMessages;
end;
end;
end;
end;
相关文章推荐
- [VB.NET]各们,请问如何使用vb.net编写两个进程间消息通信的程序啊
- 使用Log4j进行日志控制,在访问程序时总是出现警告消息
- 如何使用TCP/IP与服务器进行通信-一个简单的聊天程序
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- 使用Windows API PostThreadMessage进行线程间消息通信
- boost线程库学习--(4)两个线程间使用队列进行通信
- 如何使用TCP/IP与服务器进行通信-一个简单的聊天程序
- 进程间通信 2 -- 使用WM_COPYDATA消息进行通信
- 控制台程序使用SendMessage进行进程间的通信
- 关于“使用显式消息进行通信”的补充
- linux进程通信:使用posix消息队列mq进行线程或进程间的通信
- 本篇主要讲解在未使用其他框架(Spring)整合情况下,独立基于ActiveMQ,使用JMS规范进行消息通信。
- 未能使用提供程序“RsaProtectedConfigurationProvider”进行解密。提供程序返回错误消息为: 打不开 RSA 密钥容器
- 使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址
- VC++ 在两个程序中 传递字符串等常量值的方法:使用了 WM_COPYDATA 消息的
- JBoss 系列十九:使用JGroups构建块RspFilter对群组通信返回消息进行过滤
- 16.4.3 使用消息进行通信
- Linux下两个程序进行socket通信的简单例子
- IOS的消息传递机制,使用NSNotificationCenter进行通信,很实用
- Android程序:使用HttpClient进行Get方式通信