如何将其它程序的窗口置于最前面?
可以通过使用 Windows API 函数 FindWindow找到一个窗口的句柄。
假设您希望将一个 Microsoft Access 窗口置于最前面:
HWND Handle= ZERO;Handle= FindWindow("OMAIN",ZERO);if(Handle){
ShowWindow(Handle, SW_MINIMIZE); //
ShowWindow ( Handle, SW_SHOWNORMAL );SetForegroundWindow(Handle);
}
elseProgramExecute("C:\\MSOffice.97\\Office\\ACCESS.EXE");
如果没有发现该窗口,随后 Microsoft Access 将重新启动。
FindWindow 函数的注意事项:
第一个参数是窗口的类。可以使用编译器(比如:用 Visual C++ 中的 Spy 命令)找到类。
第二个参数是窗口的标题(标题栏)。可以指定两个参数中的任何一个,或者两个都指定。在本例中命令类似于以下形式:
Handle=FindWindow(NULL,"Microsoft Access -");
如果寻找窗口的标题,那么请注意对于一些程序标题是有规定语言的,对于不同的语言有可能寻找不到。类总是独立于语言的。
如果知道窗口的类,那么也可以将此过程用于其它的应用程序。
以下是一些应用程序的窗口类 的名称:
应用程序
类名称
Microsoft Access
OMAIN
Internet Explorer
IEFrame
Microsoft Excel
XLMAIN
Microsoft Word
OpusApp
MS-DOS Input Prompt
ConsoleWindowClass
Notepad
Notepad
Paint:
MSPaintApp
Calculator
SciCalc
Windows Explorer
ExploreWClass
SIMATIC Manager
s7tgtopx
WinCC V4.x Control Center
MCPFrameWndClass
WinCC V5.x/ V6.x/ V7.x WinCC Explorer
WinCCExplorerFrameWndClass
WordPad
WordPadClass
例子 1 :
WinCC V5.x / WinCC V6.x / WinCC V7.x:将 WinCCExplorer 置于最前面
HWND Handle= ZERO;
Handle= FindWindow("WinCCExplorerFrameWndClass",ZERO);
if(Handle)
{
ShowWindow(Handle, SW_MINIMIZE);
// This entry is only necessary in Windows 2000
//(or Windows XP in the case of WinCC V6.x / WinCC V7.x)
ShowWindow ( Handle, SW_SHOWNORMAL );
SetForegroundWindow(Handle);
}
例子 2 :
WinCC V4:将 Control Center 置于最前面
HWND Handle= ZERO;
Handle= FindWindow("MCPFrameWndClass",ZERO);
if(Handle)
{
ShowWindow ( Handle, SW_SHOWNORMAL );
SetForegroundWindow(Handle);
}
关键词:
编程技巧
如何在 WinCC 运行时通过按下一个按钮来启动一个程序,打印一个文本文件或者打开一个PDF文件?
隐藏订货号显示订货号订货号:
:WinCC 在动态向导里提供了方便的“启动其他应用程序”功能来启动一个外部程序。这个向导生成一个C 脚本。为了给这个程序添加参数,可以打开该脚本并添加相关参数。下面提供了一些例子,这里只显示了脚本中最重要的那一行语句。
序号.
例程
1
调用标准程序:
l ProgramExecute("C:\\WindowS\\winhlp32.exe");
2
打开 PDF 文件:
l ProgramExecute("C:\\program files\\Adobe\\Reader 8.0\\Reader\\AcroRD32.exe C:\\Temp\\document.pdf");
3
打印文本文件:
l ProgramExecute("C:\\WINDOWS\\system32\\print.exe C:\\Temp\\document.txt /C");
也可以在 WinCC 在线帮助中找到相关描述,在目录 "WinCC 信息系统 > 使用 WinCC > 用于创建函数和动作的 ANSI-C > ANSI-C 函数描述> 标准函数 > Windows" ,如果您使用的是VBS, 则在目录 "使用 WinCC > 用于创建程序和动作的 VBS > VBScript实例 > 常规例程"。
注意:
l 在编写 C 动作时,当指定路径时必须输入双斜线 ( "\" ),否则会被解释为一个控制字符。
l 当调用某些文件类型(如 Microsoft Excel文件)时,需要输入不止一个函数参数。因此,如果路径规范里包含一个路径,需要在函数参数里面将该路径放在反斜线和双引号标志之间,(如,ProgramExecute("C:\\Programme\\Microsoft Office\\OFFICE11\\EXCEL.EXE \"C:\\temp\\New Folder\\Mappe1.xls\""))。
l 注意当操作员打开系统窗口的时候,可能会有操作系统级别的系统操作。执行完程序之后关闭这些窗口。
l 您可以用Win32 API函数终止一个程序,更多信息和例程可参考条目号 2976503。
关键词:
22560470
WinHelp (Windows Help) via API
隐藏订货号显示订货号订货号:
QUESTION:Can a user-specific Help be called in a WinCC project?
ANSWER:Yes, in WinCC you can call use an API call to call a user-specific Help. With "fuCommand" you can branch to a specific topic. For this you create a new project function with the following code:
#pragma code("user32.dll")BOOL WinHelpA(hwnd, lpszHelpFile, fuCommand, dwData);#pragma code()#define HELP_CONTENTS 0x0003L
void WinHelpApi(){HWND hwnd; /* handle of window requesting help */char HelpFile[255];UINT fuCommand; /* type of help */DWORD dwData; /* additional data */BOOL bRetVal;LPCTSTR lpszHelp;
lpszHelp = HelpFile;strcpy(HelpFile, "c:\\Win.95\\Help\\Calc.hlp");hwnd = FindWindow("PDLRTisAliveAndWaitsForYou","WinCC Runtime - ");fuCommand = HELP_CONTENTS;dwData = 0L;
bRetVal=WinHelpA((DWORD) hwnd,(DWORD) lpszHelp, fuCommand, dwData);
printf("hwnd: %d \r\n",hwnd);printf("HelpFile: %s \r\n",HelpFile);printf("bRetVal: %d \r\n",bRetVal);}
In this example the "Help for Windows Pocket Computers" is opened. If you want to open a different Help file, replace the "HelpFile" string with the path of a different file. If the return value "bRetVal" is equal to 0, an error has occurred. You can now call this project function, for example, by clicking a button
Here, we are talking about calling a Windows function. Detailed descriptions are given for instance in the documentation for Visual C++. This example is solely to demonstrate how to incorporate the call in WinCC.
Print out ASCII file via Action
隐藏订货号显示订货号订货号:
QUESTION:.How can I print out an ASCII file via Action?
ANSWER: If you want to print out an ASCII file via Action (for example for production data acquisition), then you need to make a function call as follows:
system("copy c:\\autoexec.bat \\\\nbgm312a\\ps1cs1");
l You must enter the path and filename in the first part of the call.
l A network printer is in the second part whose address is given under Printer Properties.
Creating a new directory via C scripts
隐藏订货号显示订货号订货号:
QUESTION:How can I create a new directory in WinCC with script functions?
ANSWER:Use the following program code if you want to create a new directory in WinCC:
#pragma code("kernel32.dll");BOOL CreateDirectoryA( LPCTSTR ,LPSECURITY_ATTRIBUTES ); #pragma code()'CreateDirectoryA("c:\\test",NULL);
使用C函数“Sleep”
隐藏订货号显示订货号订货号:
问题:如何在WinCC中编程“Sleep”等待功能?
解答:为此,可以使用Windows API功能“Sleep()”。下面的样例程序演示了如何使用“Sleep”功能。
#pragma code("Kernel32.dll")void Sleep(int Milliseconds);#pragma code()
Sleep(1000); //time in milliseconds
警告:“Sleep”函数对动作处理性能有很大的负面影响。因此,如果想用此函数的话,请注意以下几点:
l 使用Sleep()时,C 脚本的处理在特定的一段时间内被中断。在此期间内,任何对于被中断功能的请求将不被处理。
l 而且,使用相同触发器的所有动作将不再被处理。使用相同的触发器意味着用同一个循环触发器所有动作或变量触发器的所有动作将不再被处理。如果同步地调用动作,这种调用通过一个变量触发器或事件被周期性地或非周期性地启动,而且所有这些功能使用了Sleep()函数,那么所有的动作会被终止。最坏情况下是;由于启动这四个动作将终止对所有动作的处理。
l 如果说,在一个带10-秒延迟触发器的动作中使用了Sleep()函数。那么所有被循环调用的动作将被中断。结果是,如:用1-秒触发器的动作操作中断, 除此以外,所有后继的动作也不被执行。这就是说,不仅当前的动作不被处理,其它还没有启动的动作也不会被处理。
l 作业不被处理是因为中断仍储存在队列中。一旦中断结束,所有在队列中的动作将开始被处理。但是,中断结束后,在队列中的动作不会在他们原来指定的循环中被处理。因此,如同前面所述的那样,那么队列中剩下的动作将被一个接一个的处理而不再由触发器启动。并且这些动作只是尽可能快的被处理掉。 (理论上同步)。
关键字:性能提高,功能调用
如何打开一个应用程序并保持其始终在前台显示?
隐藏订货号显示订货号订货号:
描述:以 Adobe Reader 8.0 作为示例,我们将演示如何打开一个程序窗口并始终在前台显示。
No.
程序
1
在按钮事件的“鼠标动作”中创建以下C 语言函数,例如:
#include "apdefap.h"void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName){HWND Handle = NULL;Handle = FindWindow("AcrobatSDIWindow",NULL);if (Handle){ShowWindow(Handle, SW_SHOWNORMAL);} else {ProgramExecute("C:/Program Files/Adobe/Reader 8.0/Reader/AcroRD32.exe");Handle = FindWindow(NULL, "Adobe Reader");}SetWindowPos (Handle, HWND_TOPMOST, 400, 200, 520, 420, 0);}
注意:为了参数传递,Windows函数 “ HWND FindWindow(LPCSTR lpClassName, LPCSTR lpWindowName);” 需要窗口的类名或者窗口自己的名字。可以很容易的通过打开相关程序获得窗口的名字(没有文档)。窗口名字会显示在标题栏。然而使用窗口名字时,当打开文档时窗口名字也许会发生改变。这也是为什么最好使用“ lpClassName ”参数的原因。
2
在按钮事件的“鼠标动作”中以下的 C 语言函数, 从窗口名称中确定了窗口的类名:为了显示“ printf() ”函数的输出,可以在 WinCC 画面中加载“ GSC - Diagnostics ” 应用程序窗口或者启动“ apdiag.exe ”程序。
#include "apdefap.h"void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName){char winclass[256];HWND Handle = NULL;Handle = FindWindow(NULL, "Adobe Reader");if (!Handle) {ProgramExecute("C:/Program Files/Adobe/Reader 8.0/Reader/AcroRD32.exe");Handle = FindWindow(NULL, "Adobe Reader");}GetClassName(Handle, winclass, sizeof (winclass)-1);printf ("Window Class Name: %s \r\n", winclass);}
继续阅读