Delphi PostMessagefindlpWindowName?

我有一个任务来控制,如果在Delphi编写的应用程序可以启动或不。

我没有编写需要控制的应用程序,此时无法编译或更改它的代码,所以我使其他控制台应用程序在后台工作,根据操作系统中的条件来启动和结束此应用程序。

我用PostMessageclosures了这个应用程序,但我不明白如何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组合唯一地定义了您要关闭的应用程序,则以这种方式关闭应用程序是非常安全的。 如果系统中有多个应用程序满足以前的条件,那么最终可能会关闭错误的应用程序,而找到正确的应用程序可能会更复杂,或者应用程序生命周期必须以另一种方式进行控制。