高人?我能得到另一程序的通知消息吗?

anakine 2001-05-11 06:07:00
OLE,DDE的客户端能得到服务器程序的消息吗?
比如在客户程序(C端)中用DDE连接到另一程序后(S端),另一程序(S端)在用户使用后被关闭了,我能在这时得到被关闭的消息吗?
高人,请指点我一条明路,急呀。
...全文
142 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
anakine 2001-05-23
  • 打赏
  • 举报
回复
是用Delphi的啊,真牛,谢啦!
spiritnet 2001-05-22
  • 打赏
  • 举报
回复
SHChangeNotify用法详见SDK,捕捉文件改变的消息用
function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMsg,dwItems:LongWord;lpps:PIDLSTRUCT):integer;
其中dwEventID参数意义与SHChangeNotify的dwEventID同.其余见以下代码(只是简单示意)
至于要知道(S端)在用户使用后被关闭了或许可用这种认为:
既然是S端,那肯定回响应C端请求,C端每隔一段时间向S端发出请求,若没回应不就说明S端被关闭了
unit notify;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,shlobj,Activex;
const WM_SHNOTIFY=WM_USER+$813;
type
TTNOTIFY = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure WMSHNotify (var uMsg:TMessage);message WM_SHNOTIFY;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type PSHNOTIFYSTRUCT=^SHNOTIFYSTRUCT;
SHNOTIFYSTRUCT=record
dwItem1:PItemIDList;
dwItem2:PItemIDList;
end;
type PIDLSTRUCT=^IDLSTRUCT;
IDLSTRUCT=record
pidl:PItemIDList;
bWatchSubFolder:integer;
end;
function SHNotify_Register(hWnd:Integer):bool;
function SHNotify_Deregister:bool;
function SHChangeNotifyDeregister(hNotify:Integer):integer;stdcall;external 'shell32.dll' index 4;
function SHChangeNotifyRegister(hWnd,uFlags,dwEventID,uMsg,dwItems:LongWord;lpps:PIDLSTRUCT):integer;
stdcall;external 'shell32.dll' index 2;

var
TNOTIFY: TTNOTIFY;
m_hSHNotify:integer;
m_pidlDesktop:PItemIDList;

implementation

{$R *.DFM}
function SHNotify_Register(hWnd:Integer):bool;
var
ps:IDLSTRUCT;
begin
result:=false;
if m_hSHNotify=0 then begin
if (SHGetSpecialFolderLocation(0,CSIDL_DESKTOP,m_pidlDesktop)<>NOERROR) then exit;
if Boolean(m_pidlDesktop) then begin
ps.bWatchSubFolder:=1;
ps.pidl:=m_pidlDesktop;
m_hSHNotify:=SHChangeNotifyRegister(hWnd,($FF or 0),($7FFFFFFF or $80000000),WM_SHNOTIFY,1,@ps);
result:=Boolean(m_hSHNotify);
end
else CoTaskMemFree(m_pidlDesktop);
end;
end;
function SHNotify_Deregister:bool;
begin
result:=false;
if Boolean(m_hSHNotify) then
if Boolean(SHChangeNotifyDeregister(m_hSHNotify)) then begin
m_hSHNotify:=0;
CoTaskMemFree(m_pidlDesktop);
result:=true;
end;
end;

procedure TTNOTIFY.Button1Click(Sender: TObject);
begin
if Boolean(m_hSHNotify) then begin
if SHNotify_Deregister then begin
Button1.Caption:='打开监视';
memo1.Lines.Add('关闭监视成功.');
end
else memo1.Lines.Add('关闭监视失败.');
end else begin
if SHNotify_Register(Self.Handle) then begin
Button1.Caption:='关闭监视';
memo1.Lines.Add('打开监视成功.');
end
else memo1.Lines.Add('打开监视失败.');
end;
end;
procedure TTNOTIFY.WMSHNotify (var uMsg:TMessage);
var
lpszText:array [0..MAX_PATH] of char;
pidlItem:PSHNOTIFYSTRUCT;
begin
pidlItem:=PSHNOTIFYSTRUCT(uMsg.wParam);
SHGetPathFromIDList(pidlItem.dwItem1,lpszText);
memo1.Lines.Add('文件:'+lpszText+'已改变'+#13#10);
end;
procedure TTNOTIFY.FormClose(Sender: TObject; var Action: TCloseAction);
begin
SHNotify_Deregister;
end;

end.
spiritnet 2001-05-18
  • 打赏
  • 举报
回复
下周一给你源码,我现在出差在外.
anakine 2001-05-17
  • 打赏
  • 举报
回复
如楼上的老兄所说,还是要用HOOK,不然就显得很傻了。

你怎么不早点来啊?我的分全给光了。
dishi 2001-05-16
  • 打赏
  • 举报
回复
一个笨方法是首先获得S端进程的句柄,在C端运行一个后台线程,监测S端的句柄,当S端被关闭后,句柄值消失。令一方法我也不清楚好象是DEBUG涵数,你找DEBUG FUNCTION这是系统给定的,装载后可用了。
anakine 2001-05-16
  • 打赏
  • 举报
回复
用不着那些的, 因为服务方的程序不是我写。
这样要知道别的进程执行的情况只好求助于系统了。
哈哈, 我一开始就提得不对。
a_niu 2001-05-16
  • 打赏
  • 举报
回复
能不能说明白点,应当可以用进程之间的通信,象命名管道,socket
anakine 2001-05-16
  • 打赏
  • 举报
回复
都怪我自己提得不好,搞得这么复杂。
xinghf 2001-05-15
  • 打赏
  • 举报
回复
直接调用sendmessage().
anakine 2001-05-15
  • 打赏
  • 举报
回复
spiritnet老兄?
怎么响应这个函数选出的系统消息呢?我SDK一点基础都没有。
anakine 2001-05-15
  • 打赏
  • 举报
回复
spiritnet老兄?
怎么响应这个函数选出的系统消息呢?SDK,我一点基础都没有。
spiritnet 2001-05-14
  • 打赏
  • 举报
回复
可以SHChangeNotify函数试试?!!!................
anakine 2001-05-14
  • 打赏
  • 举报
回复
现在我程序中的问题已经解决了,用了个笨方法...不断读取目标文件的修改时间。
本来想搞个象Winzip那样的实现,把包里的文件打开并修改后能自动检测是否修改,并提示保存,可真做起来...就没有人指点我别的方法吗?
高手在哪啊????
anakine 2001-05-14
  • 打赏
  • 举报
回复
天,发什么样的消息?发了我怎么在C端去响应呢?用hook?不会吧,我一点都不懂那个的;
这可是跨进程的啊。
hello_wyq 2001-05-12
  • 打赏
  • 举报
回复
好像也只能是楼上的了!
高手们到哪里去了?

dishi 2001-05-12
  • 打赏
  • 举报
回复
你可以在s端被关闭之前发送一个消息
anakine 2001-05-12
  • 打赏
  • 举报
回复
双周日就一个人也没有了?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧