如何判断我的控制台应用程序是否已创建自己的窗口?
我想检测到这一点,以便我可以显示“按Enter键关闭窗口”这样的消息,让用户阅读窗口关闭前显示的内容.显然,如果从命令行运行应用程序,那么这样做是不合适的.
我正在使用Delphi 2010,以防万一.
解决方法
>应用程序控制台是否在进程之间共享?如果使用cmd.exe运行控制台应用程序,它将默认共享控制台,因此您无需显示“按Enter键关闭窗口”消息.
>输出是否重定向到文件?如果是这样,也没有必要显示消息.
对于第一个,有一个简单的解决方案,形式为GetConsoleProcessList()
Windows API函数.不幸的是,它仅适用于Windows XP及更高版本,但也许这对你来说已经足够了.它不在Delphi 2009 Windows单元中,因此您必须自己导入它:
function GetConsoleProcessList(lpdwProcessList: PDWORD; dwProcessCount: DWORD): DWORD; stdcall; external 'kernel32.dll';
当然,如果您的软件能够在早期的Windows版本上运行,则应使用LoadLibrary()和GetProcAddress().
由于您只关心进程句柄的数量是否大于1,因此可以使用非常小的句柄缓冲区来调用它,例如:
var HandleCount: DWORD; ProcessHandle: DWORD; begin HandleCount := GetConsoleProcessList(@ProcessHandle,1); // ... end;
如果您的句柄数大于1,则您有其他进程保持控制台处于打开状态,因此您可以跳过显示该消息.
您可以使用GetFileInformationByHandle()
Windows API函数来检查控制台输出句柄是否引用了真实文件:
var StdOutHandle: THandle; IsNotRedirected: boolean; FileInfo: TByHandleFileinformation; begin StdOutHandle := GetStdHandle(STD_OUTPUT_HANDLE); IsNotRedirected := not GetFileinformationByHandle(StdOutHandle,FileInfo) and (GetLastError = ERROR_INVALID_HANDLE); // ... end;
这段代码只是为了让你开始,我确信有些角落的情况没有得到妥善处理.
原文地址:https://www.jb51.cc/delphi/101715.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。