×
Siemens Industry Online Support
Siemens AG
文档类型 常问问题 文档编号 415808, 文档发布日期 2018年9月21日
(4)
评估

如何在 WinCC/WinCC Professional Runtime 中将其它程序的窗口置于最前面?

推荐文档: 西门子工程师推荐本文档!
  • 文档
  • 涉及产品
可以通过 C 脚本使用 Windows API 函数“FindWindow” 来实现将窗口放置最前端。
可以通过 C 脚本使用 Windows API 函数“FindWindow” 来实现将窗口放置最前端。

1) 将窗口放置最前端(C script)

当 WinCC PC Runtime 运行时,在操作单元,任务切换功能经常被阻塞。当在 Runtime 运行时打开程序,运行窗口会导致已经被打开的程序跑到运行窗口后面,并且无法再次被调用到前面。通过下面的 C 脚本,可以实现将置后的窗口调到前面。

1.1) 函数"FindWindow"

通过使用 Windows API 函数 "FindWindow" 将窗口前置:

HWND WINAPI FindWindow(LPCSTR lpClassName , LPCSTR lpWindowName);

1.2) "FindWindow" 函数的参数

  • 第一个参数 "LPCSTR lpClassName" 是窗口名称.
  • 第二个参数 "LPCSTR lpWindowName" 是窗口标题(标题栏).

也可以指定两个参数中的一个或者一起指定。

1.3) 例子 1: 将 Microsoft Access 窗口置于前端

1.3.1) 使用类将 Microsoft Access 窗口置于前端:

HWND Handle= NULL;
Handle= FindWindow("OMAIN",NULL);
if(Handle)
{
ShowWindow(Handle, SW_MINIMIZE);
ShowWindow (Handle, SW_SHOWNORMAL);
SetForegroundWindow(Handle);
}
else
ProgramExecute("C:\\MSOffice.97\\Office\\ACCESS.EXE");

如果找不到窗口,则重启 Microsoft Access。

1.3.2) 通过标题将 Microsoft Access 窗口置于前端:

HWND Handle= NULL;
Handle=FindWindow(NULL,"Microsoft Access -");
if(Handle)
{
ShowWindow(Handle, SW_MINIMIZE);
ShowWindow (Handle, SW_SHOWNORMAL);
SetForegroundWindow(Handle);
}
else
ProgramExecute("C:\\MSOffice.97\\Office\\ACCESS.EXE");

 如果找不到窗口,则重启 Microsoft Access。

1.4) 例子 2: 将 WinCC Professional Runtime 窗口从后面置于前端

HWND Handle = NULL;
Handle = FindWindow("PDLRTisAliveAndWaitsForYou",NULL);
if(Handle)
{
ShowWindow(Handle, SW_MINIMIZE);
ShowWindow ( Handle, SW_SHOWNORMAL );
SetForegroundWindow(Handle);
}


1.5) 例子 3: 将 WinCC Explorer 置于前端(WinCC 5.x / WinCC V6.x / WinCC V7.x)

HWND Handle= NULL;
Handle= FindWindow("WinCCExplorerFrameWndClass",NULL);
if(Handle)
{
ShowWindow(Handle, SW_MINIMIZE);
ShowWindow ( Handle, SW_SHOWNORMAL );
SetForegroundWindow(Handle);
}

2) 常用程序的类

2.1) Microsoft 应用

应用

类名称

Windows 2000/XP

类名称

Windows 7

类名称
Windows 8 /
Server 2008 R2
类名称
Windows 10 /
Server 2012 R2

Access

OMAIN

OMAINOMAINOMAIN

Internet Explorer

IEFrame

IEFrameIEFrameIEFrame

Microsoft Excel

XLMAIN

XLMAINXLMAINXLMAIN

Microsoft Word

OpusApp

OpusAppOpusAppOpusApp

MS-DOS input prompt

ConsoleWindowClass

ConsoleWindowClassConsoleWindowClassConsoleWindowClass

Notepad (editor)

Notepad

NotepadNotepadNotepad

Paint

MSPaintApp

MSPaintAppMSPaintAppMSPaintApp

Calculator

SciCalc

CalcFrameCalcFrameCalcFrame
Windows ExplorerExploreWClassCabinetWClassCabinetWClassCabinetWClass

WordPad

WordPadClass

WordPadClassWordPadClassWordPadClass

表 01

2.2) SIMATIC 软件

SIMATIC 软件

类名称

SIMATIC Managers7tgtopx

WinCCV4.x Control Center

MCPFrameWndClass

WinCC V5.x / V6.x / V7.x WinCC Explorer

WinCCExplorerFrameWndClass

WinCC Runtime Advanced V11..14

HmiRTm

WinCC Runtime Professional V11..14

PDLRTisAliveAndWaitsForYou

表 02

3) 确定窗口类/标题

如果希望将未列出的程序前置,必须首先确定窗口类的名称或窗口的标题。

注意,当使用窗口标题时,打开文档时窗口标题可能会发生更改。此外,有些程序的标题是特定语言下有的,因此,在不同的语言下可能找不到窗口标题。

类是独立于语言的。这也是为什么最好使用窗口类的原因(参数 "lpClassName")。

3.1) 确定标题

通过打开相应的程序(不需要文档),可以很容易的确定一个窗口的标题。窗口标题会显示在标题栏里。

3.2) 确定类

可以功过使用编译器 (例如: 从 Visual C++调查),或者通过 C 脚本确定窗口类。

下面的 C 脚本从窗口名称确定窗口类名称。
可以通过按钮事件关联脚本,例如,通过使用 WinCC Runtime / WinCC Runtime Professional 确定类。

例子 4: 确定 WinCC 中“计算器”应用程序窗口的类。

要接收"printf()"函数的输出,可以在 WinCC 画面中使用"GSC - Diagnostics"应用程序或启动 "apdiag.exe" 程序。

#include "apdefap.h"
void ShowWindowClass()
{
char WindowClass[256];
HWND Handle = NULL;
Handle = FindWindow(NULL, "Computer");
GetClassName(Handle, WindowClass, sizeof (WindowClass)-1);
printf ("Window Class Name: %s \r\n", WindowClass);
}

例子 5: 确定 WinCC Professional 中多应用窗口类。
要接收 "printf()"函数的输出,可以在 WinCC 画面中使用 "Print job/Script diagnostics" 控件。这个控件在工具栏的“控件”标签下。

这个函数有传送参数 "WindowTitle"。只要在每个情况下都知道标题,通过传送参数,可以确定任何窗口的类。
您也可以在没有传输参数的情况下工作,但是必须在代码中指定窗口的标题,如示例 4 所示。

#include "GlobalDefinitions.h"
void ShowWindowClass(char* WindowTitle)
{
char WindowClass[256];
HWND Handle = NULL;
Handle = FindWindow(NULL, "WindowTitle");
GetClassName(Handle, WindowClass, sizeof (WindowClass)-1);
printf ("Window Title: %s", WindowTitle);
printf (",Window Class Name: %s \r\n", WindowClass);
}

 

4) 将窗口永久置于前端

下面的设置在 Windows 7 中可以支持,将应用程序保持在前端:



图. 01


这个设置可以在下面找到 "开始 > 控制面板 > 轻松访问中心> 使鼠标易于使用> 便于管理窗口"。选择“防止将窗口移动到屏幕边缘时自动排列”。

关键字

编程技巧, 2522765, 108819546, TIA Portal PC Runtime, Script, 置顶, Macro

安全信息
为了保护工厂,系统,机器和网络免受网络威胁,有必要实施并持续维护一个整体的,最先进的工业安全概念。西门子产品和解决方案构成了这样一个概念的一个要素。更多信息和工业安全信息,请访问下面连接:
http://www.siemens.com/industrialsecurity.