Windows Delphi PostMessage查找lpWindowName?
我有一个任务来控制用Delphi编写的应用程序是否可以启动 我没有编写需要控制的应用程序,目前无法编译或更改其代码,因此我让其他控制台应用程序在后台工作,根据操作系统中的条件启动和结束此应用程序 我使用Windows Delphi PostMessage查找lpWindowName?,windows,delphi,window,console-application,postmessage,Windows,Delphi,Window,Console Application,Postmessage,我有一个任务来控制用Delphi编写的应用程序是否可以启动 我没有编写需要控制的应用程序,目前无法编译或更改其代码,因此我让其他控制台应用程序在后台工作,根据操作系统中的条件启动和结束此应用程序 我使用PostMessage关闭此应用程序,但我不知道如何找到需要关闭的应用程序的WindowName 我该怎么做?我有应用程序的源代码。我使用“TApplication”作为类名。这在Windows中使用安全吗?为了找到您正在查找的应用程序的正确窗口句柄,您需要知道将发送到FindWindow函数的两
PostMessage
关闭此应用程序,但我不知道如何找到需要关闭的应用程序的WindowName
我该怎么做?我有应用程序的源代码。我使用
“TApplication”
作为类名。这在Windows中使用安全吗?为了找到您正在查找的应用程序的正确窗口句柄,您需要知道将发送到FindWindow
函数的两个参数
1。窗口类名称
对于大多数应用程序,向主窗体窗口句柄发送WM_CLOSE
消息将终止应用程序
也可以使用应用程序窗口句柄,但仅适用于2007年之前以Delphi版本编写的应用程序,或将Application.MainFormOnTaskbar
属性设置为false的应用程序
注:在Delphi 2007中引入
对于主窗体窗口,类名称将是主窗体类名称(例如'TForm1'
),对于应用程序句柄窗口,类名称是'TApplication'
2。窗口名称(标题)
此值取决于您是将消息发送到应用程序窗口还是主窗体窗口
对于应用程序,这将是应用程序。Title
值或如果未明确设置,将使用程序名
program MyApplication;
...
begin
Application.Initialize;
Application.Title := 'My Application Title';
...
如果使用主窗体窗口,则值将是主窗体标题属性
因此,一般来说,以下一些组合会给您提供适当的结果(当然,结合实际的类名和窗口标题)
虽然上述规则通常有效,但应用程序可能会以动态方式设置这些值,在这种情况下,您必须使用EnumWindows
而不是Findwindow
如果窗口类名和窗口名的组合唯一地定义了您要关闭的应用程序,则以这种方式关闭应用程序是完全安全的。如果系统中有多个应用程序满足以前的条件,那么很可能最终关闭错误的应用程序,找到正确的应用程序可能会更加复杂,或者应用程序的生命周期必须以另一种方式控制 主窗口名称(标题)是否唯一?虽然这通常适用于许多Delphi应用程序,但并不适用于所有Delphi应用程序。例如,如果应用程序动态设置了Application.Title
,您将无法硬编码名称,因此必须在运行时查找它,例如使用EnumWindows()
。如果一个应用程序使用了Application.MainFormOnTaskbar=True
(现在大多数现代的Delphi应用程序都这样做),你甚至不应该与TApplication
窗口交互,你必须与MainForm
窗口交互,并且它的类名在多个应用程序中可能是唯一的,也可能不是唯一的。@RemyLebeau我正在使用自定义解决方案来处理不包括TApplication
的应用程序之间的消息,因此我完全不知道MainFromOnTaskBar
会改变应用程序响应外部消息的方式。我的代码对这两个方面都很好。我可以做一些研究(事实上,我已经做了一些研究)并发布更完整的解决方案,但如果你能发布你自己的、更详细的答案,也许会更好。MainFormOnTaskbar
做了很多事情(比它应该做的更多),但它主要指定是TApplication
窗口还是TApplication.MainForm
窗口代表应用程序到Windows本身。但它不会改变窗口消息的接收方式。您仍然可以将消息发送到TApplication
窗口,但根据特定的消息,该窗口可能不是发送消息的正确窗口。@RemyLebeau我理解您的意思,但没有清楚地表达自己的意思。在这种情况下,根据MainFormOnTaskbar
的不同,终止请求的处理方式也不同,而这正是OP所要求的。
var h: HWND;
h := FindWindow('TApplication', 'MyApplication');
h := FindWindow('TApplication', 'My Application Title');
h := FindWindow('TForm1', 'Form1');