我有一个任务来控制,如果在Delphi编写的应用程序可以启动或不。
我没有编写需要控制的应用程序,此时无法编译或更改它的代码,所以我使其他控制台应用程序在后台工作,根据操作系统中的条件来启动和结束此应用程序。
我用PostMessage
closures了这个应用程序,但我不明白如何find什么是我需要closures的应用程序的WindowName
。
我怎样才能做到这一点? 我有应用程序的源代码。 我使用"TApplication"
作为类名。 这是安全的使用Windows?
为了找到正在寻找的应用程序的正确的窗口句柄,你需要知道你将发送给FindWindow
函数的两个参数
1.窗口类的名字
对于大多数应用程序发送WM_CLOSE
消息到主窗体句柄将终止应用程序。
也可以使用应用程序窗口句柄,但仅适用于2007年之前的Delphi版本编写的应用程序或Application.MainFormOnTaskbar
属性设置为false的Application.MainFormOnTaskbar
。
注意: Application.MainFormOnTaskbar是在Delphi 2007中引入的。
对于主表单窗口类名称将是主窗体类名称(例如'TForm1'
),对于应用程序句柄窗口类名称是'TApplication'
2.窗口名称(标题)
这个值将取决于您是否将消息发送到应用程序窗口或主窗体。
对于应用程序,这将是Application.Title
值或如果没有明确设置程序名将被使用。
program MyApplication; ... begin Application.Initialize; Application.Title := 'My Application Title'; ...
如果您使用主窗体窗口值将主窗体Caption
属性。
所以一般来说下面的一些组合会给你正确的结果(当然,结合你实际的类名和窗口标题)
var h: HWND; h := FindWindow('TApplication', 'MyApplication'); h := FindWindow('TApplication', 'My Application Title'); h := FindWindow('TForm1', 'Form1');
虽然上面的规则通常是有效的,但应用程序可能会以动态方式设置这些值,在这种情况下,您将不得不使用EnumWindows
而不是Findwindow
。
如果window class name & window name
组合唯一地定义了您要关闭的应用程序,则以这种方式关闭应用程序是非常安全的。 如果系统中有多个应用程序满足以前的条件,那么最终可能会关闭错误的应用程序,而找到正确的应用程序可能会更复杂,或者应用程序生命周期必须以另一种方式进行控制。