Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows Delphi PostMessage查找lpWindowName?_Windows_Delphi_Window_Console Application_Postmessage - Fatal编程技术网

Windows Delphi PostMessage查找lpWindowName?

Windows Delphi PostMessage查找lpWindowName?,windows,delphi,window,console-application,postmessage,Windows,Delphi,Window,Console Application,Postmessage,我有一个任务来控制用Delphi编写的应用程序是否可以启动 我没有编写需要控制的应用程序,目前无法编译或更改其代码,因此我让其他控制台应用程序在后台工作,根据操作系统中的条件启动和结束此应用程序 我使用PostMessage关闭此应用程序,但我不知道如何找到需要关闭的应用程序的WindowName 我该怎么做?我有应用程序的源代码。我使用“TApplication”作为类名。这在Windows中使用安全吗?为了找到您正在查找的应用程序的正确窗口句柄,您需要知道将发送到FindWindow函数的两

我有一个任务来控制用Delphi编写的应用程序是否可以启动

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

我使用
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');