在自己的程序里如何强制外部程序窗口刷新.同一问题第二次提出,不解决就不放弃.又是100分送出来.

axb99 2005-05-30 09:47:15
原帖:http://community.csdn.net/Expert/topic/4035/4035956.xml?temp=.8545648

在自己的程序里如何强制另外一个程序的主窗口刷新
我的程序A.exe
另一个程序B.exe
B.exe 的配置文件b.ini
B.exe的主窗口中显示的信息是读取b.ini来的
在B.exe 正在运行时,我用自己的程序A.exe改了b.ini里的内容
现在的问题是如何让B.exe 刷新(或者说重载)b.ini的信息.

我在A.exe里杀死B.exe后再重运行的方法行不通,因为B.exe在被杀死时会强制电脑重新启动.


B.exe不是我写的.
现在发现B.exe有两个模块B1.exe,B2.exe,其中B1.exe就是负责加载b.ini的,因为我只杀死B1.exe的活,窗口就不见了,杀死B1.exe后B2.exe还在运行,而且B2.exe的功能还正常.
只是现在无法单独重启B1.exe,点击B.exe运行也不行.只有杀死两个模块B1.exe B2.exe后才能重运行成功.当杀死B2.exe时就会被强制重启电脑.

程序B.exe本身是可以重新加载b.ini的,就是在它的设置程序窗口中,点确定就会重新加载b.ini的内容.它的设置程序Bsetup.exe是可以单独运行的.不知Bsetup.exe是如何实现的.

现在我的思路集中在如何让B1.exe单独被杀死、重新运行.还有就是两个模块虽然是EXE文件,但是却不能单独的通过双击来运行,只能双击B.exe能正常运行。
这种分模块的程序没搞过,不知道是如何控制的.


...全文
251 20 点赞 打赏 收藏 举报
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
RamjetZhang 2005-06-05
建议:以user/guest身份运行b程序,同时配置windows策略禁止user/guest重启计算机;
偶最讨厌那些自说自话重启/删除文件/修改全局设置的程序,其应当归属于恶意程序之中。
别人的程序没代码总是很麻烦的。
  • 打赏
  • 举报
回复
axb99 2005-06-05
据说高手都是在深夜露面,顶上去试试.
  • 打赏
  • 举报
回复
axb99 2005-06-03
Bsetup.exe是可以单独运行的.

我对"跟踪别人的程序"一点都不在行,倒是遇到这问题后很有兴趣学一下.
有什么好用的工具推荐一下.
  • 打赏
  • 举报
回复
fyhui 2005-06-03
为什么不对Bset.exe做一下动态跟踪呢,看看到底做了什么东西。找到点击按钮后的触发代码跟踪一下,这也是个思路吧,省得去猜别人的代码。
不知道Bsetup.exe能不能单独运行,不需要B1.exe或B2.exe.
另外,也可以动态跟踪B.exe程序,或反汇编,找生成进程的命令,看看调用参数。

这段时间经常跟踪别人的程序,嗬嗬,就想到这些
  • 打赏
  • 举报
回复
axb99 2005-06-02
谢谢titan_ysl(泰坦)

这段代码我试了一下还是不行
可以启动Bsetup.exe 也可以找到窗口的hWnd
可是无法找到hWnd1=FindWindowEx(hWnd,NULL,NULL,"确定");
hWnd1总是NULL .用ccrun 写的那个工具Spy4Win 0.12 也无法找到确定按钮的HWND
可能是因为这个程序的那个"确定"按钮用的不是Button.



  • 打赏
  • 举报
回复
onestation 2005-06-01
你用API钩子钩住ExitWindowsEx函数,不让它执行就可以阻止关机了!
  • 打赏
  • 举报
回复
titan_ysl 2005-06-01
可能B.exe和B2.exe是互相监视的,一个结束另一个就会自动关机,能不能 同时结束B.exe和B2.exe 两个进程。

还有一个笨办法:
1.就是一直运行Bsetup.exe
2.A.exe改写了ini文件后, 用下面的函数按Bsetup.exe的确定按钮。


HWND hWnd,hWnd1;
hWnd=FindWindow(NULL,"Bsetup.exe的窗口标题");
if(hWnd)
{
hWnd1=FindWindowEx(hWnd,NULL,NULL,"把确定按钮上面的字放在这里");
BYTE pointerx,pointery;
pointerx=10;
pointery=10;
WORD pt = MAKEWORD(pointerx,pointery);
SendMessage(hWnd1, WM_LBUTTONDOWN,MK_LBUTTON,(LPARAM)&pt);
SendMessage(hWnd1,WM_LBUTTONUP,MK_LBUTTON,(LPARAM)&pt);
}
  • 打赏
  • 举报
回复
weill 2005-06-01
本人的意见如下:
1、那几个程序不是你写的,那么,你想完美地控制那些程序基本上是不可能的。
2、可以考虑提升你的程序的权,然后连续地发送中止对象程序的指令有可能中止它们。
  • 打赏
  • 举报
回复
titan_ysl 2005-06-01
要安装啊,没兴趣。
Bsetup.exe 可以这样调用。
A.exe改写了ini文件后执行下面的。

STARTUPINFO si = {0};
GetStartupInfo(&si);
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pf;
CreateProcess("Bsetup.exe带路径全文件名",NULL,NULL, NULL, false,NORMAL_PRIORITY_CLASS, NULL, "Bsetup.exe路径", &si, &pf);
Sleep(500);

HWND hWnd,hWnd1;
hWnd=FindWindow(NULL,"Bsetup.exe的窗口标题");
if(hWnd)
{
hWnd1=FindWindowEx(hWnd,NULL,NULL,"把确定按钮上面的字放在这里");
BYTE pointerx,pointery;
pointerx=10;
pointery=10;
WORD pt = MAKEWORD(pointerx,pointery);
SendMessage(hWnd1, WM_LBUTTONDOWN,MK_LBUTTON,(LPARAM)&pt);
SendMessage(hWnd1,WM_LBUTTONUP,MK_LBUTTON,(LPARAM)&pt);
}
  • 打赏
  • 举报
回复
axb99 2005-06-01
titan_ysl(泰坦)

点Bsetup.exe的"确定"后它自己就终止了呀,它的作用就是设置B的一些运行参数.

这是我说的程序的下载地址,用兴趣的可以看看.
http://www.sicent.com/download/gotoURL.asp?id=16

我要做的程序绝对不是要破解它,而是要加进去一个功能.
  • 打赏
  • 举报
回复
mmking33 2005-05-31
[因为Bsetup.exe是一个单独的可运行的程序,估计点确定后会重发出让B1.exe更新窗口的命令.只是会是什么样的命令猜测不出.]

用SPY++看看它发出了什么消息
  • 打赏
  • 举报
回复
axb99 2005-05-31

经过反复观察发现:
Bsetup.exe在没有启动B1.exe,B2.exe时也可单独运行.在Bsetup.exe中点确定后如果B1.exe在运行中则会更新窗口,同时b.ini内容也被更新了,若不在运行状态则只把信息更新到b.ini中.

因为Bsetup.exe是一个单独的可运行的程序,估计点确定后会重发出让B1.exe更新窗口的命令.只是会是什么样的命令猜测不出.
  • 打赏
  • 举报
回复
axb99 2005-05-31
据说高手都是在深夜露面,顶上去试试.
  • 打赏
  • 举报
回复
happyct 2005-05-31
点击了“确定”而已,你你能捕捉什么消息啊?模拟的话可能不太好实现。比较这个窗体要先显示,然后再模拟鼠标点击一下,这样一来岂不是看着很不乐观啊
  • 打赏
  • 举报
回复
axb99 2005-05-31
"程序B.exe本身是可以重新加载b.ini的,就是在它的设置程序窗口中,点确定就会重新加载b.ini的内容.它的设置程序Bsetup.exe是可以单独运行的.不知Bsetup.exe是如何实现的."

如果可以模拟Bsetup.exe点确定后的操作或许可以实现,有什么办法可以跟踪它做了什么,或发出什么样的消息不?
  • 打赏
  • 举报
回复
happyct 2005-05-31
zt

如何禁止Windows关机呢?换句话说,如何得到Windows关机的通知呢?

原理:Windows在关机的时候会想所有顶层窗口广播一个消息WM_QUERYENDSESSION,其lParam参数可以区分是关机还是注销用户(注销用户时lParam是ENDSESSION_LOGOFF)。然后Windows会等到所有的应用程序都对这个消息返回TRUE才会关机,因此,只要我们的应用程序对这个消息的处理返回FALSE,Windows就不会关机了。而且通过这个例子,大家也应该可以区分系统关机和注销用户了吧(本例子不能区分)。下面看例子,例子的源程序在这里。

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{

switch (iMsg)
{

case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
case WM_QUERYENDSESSION:
::MessageBox(hwnd,"未经本程序许可,你不能关机!","禁止关机",MB_OK|MB_SYSTEMMODAL);

return 0;//此处返回0则不能关机,返回1就能关机。
}
return DefWindowProc (hwnd, iMsg, wParam, lParam) ;
}


为了节省篇幅,这里之列出了消息处理过程。为了更清楚的看到消息处理,这个例子没有用VCL,而是直接使用了SDK。

另外,这个程序也不是绝对能阻止Windows关机,因为如果某个应用程序调用ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);来关机,我这个程序就阻止不了,应为那样调用ExitWindowsEx,系统不会发出WM_QUERYENDSESSION消息,我那个程序也就没有用了,呵呵。


不知道这个能否阻止B2的关机(可能行不太大,试试吧)
  • 打赏
  • 举报
回复
happyct 2005-05-31
不知道能否阻止B2.exe被关闭是重启电脑。如果可以的话,也是一个好办法
  • 打赏
  • 举报
回复
happyct 2005-05-31
单击B1.exe不能运行,那是因为在B1.exe的启动时判断了是否有B2.exe在进程中,我的一个程序也是这样控制的。为得就是防止其它人恶意操作

所以你的“思路集中在如何让B1.exe单独被杀死、重新运行”是不太可行,除非你能让B2.exe不在进程列表中出现(个人理解)
  • 打赏
  • 举报
回复
mmking33 2005-05-31
2个模块不能双击运行,可能它需要接收参数,由B.exe负责收集必要参数后启动B1/B2.exe.
  • 打赏
  • 举报
回复
axb99 2005-05-30
up
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ Builder
创建于2007-08-02

1.3w+

社区成员

C++ Builder相关内容讨论区
申请成为版主
帖子事件
创建了帖子
2005-05-30 09:47
社区公告
暂无公告