问题标签 [windows-95]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - 如何在任务栏中正确显示无模式表单
我正在努力实现古老的 Delphi 梦想,即在任务栏中出现无模式表单。
在任务栏中显示无模式表单的正确方法是什么?
研究工作
这些是我解决问题的尝试。需要做很多事情才能使其正常运行- 只是在任务栏上显示一个按钮并不是解决方案。我的目标是让 Windows 应用程序像 Windows 应用程序一样正常运行。
对于那些了解我,以及我的“展示研究工作”有多深入的人,请坚持住,因为这将是疯狂的兔子洞。
问题在标题中,以及上面的水平线上方。以下所有内容仅用于说明为什么一些经常重复的建议是不正确的。
Windows 仅创建为无主窗口的任务栏按钮
最初我有我的“主要形式”,从中我展示了另一种无模式形式:
这正确显示了新表单,但任务栏上没有出现新按钮:
没有创建任务栏按钮的原因是因为这是设计使然。Windows 只会为“无主”的窗口显示任务栏按钮。这种无模式的 Delphi 形式是绝对拥有的。在我的情况下,它归Application.Handle
:
我的项目名称是,它是与所有者关联ModelessFormFail.dpr
的 Windows 类名的由来。Modelessformfail
幸运的是,有一种方法可以强制Windows 为窗口创建任务栏按钮,即使该窗口是拥有的:
只需使用WS_EX_APPWINDOW
的 MSDN 文档WS_EX_APPWINDOW
说:
WS_EX_APPWINDOW
0x00040000L
当窗口可见时,强制在任务栏上显示一个顶级窗口。
它也是一个著名的 Delphi技巧来覆盖CreateParams
和手动添加WS_EX_APPWINDOW
样式:
当我们运行它时,新创建的无模式表单确实有自己的任务栏按钮:
我们完成了吗?不,因为它的行为不正确。
如果用户单击frmMain任务栏按钮,则该窗口不会前移。取而代之的是另一种形式(frmModeless):
一旦您了解了 Windows 的所有权概念,这就是有意义的。Windows 将按照设计将任何儿童拥有的表单向前推进。这是所有权的全部目的 - 将拥有的表单保持在其所有者之上。
使表单实际上是无主的
正如你们中的一些人所知,解决方案不是与任务栏启发式和窗口作斗争。如果我希望表单是无主的,请将其设为无主。
这(相当)简单。CreateParam
强制所有者窗口为null
:
顺便说一句,我想调查是否有一种方法可以使用PopupMode
andPopupParent
属性使窗口无主。我发誓我在某处读到了一条评论(来自大卫),说如果你通过Self
了PopupParent
,例如:
它应该是向 Delphi 表明您希望形成“没有所有者”的超级秘密方式。但我现在在任何地方都找不到评论。不幸的是,没有组合PopupParent
并PopupMode
导致表单实际上是无主的:
- 弹出模式:pmNone
- 业主 hwnd:
Application.Handle/Application.MainForm.Handle
- 业主 hwnd:
- 弹出模式:pmAuto
- 业主 hwnd:
Screen.ActiveForm.Handle
- 业主 hwnd:
- 弹出模式:pmExplicit
- PopupParent:无
- 业主 hwnd:
Application.MainForm.Handle
- 业主 hwnd:
- 弹出父:
AForm
- 业主 hwnd:
AForm.Handle
- 业主 hwnd:
- PopupParent:自我
- 业主 hwnd:
Application.MainForm.Handle
- 业主 hwnd:
- PopupParent:无
我无能为力会导致表单实际上没有所有者(每次使用 Spy++ 检查)。
WndParent
期间手动设置CreateParams
:
- 确实使表单无主
- 它确实有一个任务栏按钮
- 并且两个任务栏按钮的行为都正确:
我们已经完成了,对吧?我是这么想的。我改变了一切以使用这种新技术。
除了我的修复问题似乎会导致其他问题 - Delphi 不喜欢我更改为表单的所有权。
提示窗口
我的无模式窗口上的一个控件有一个工具栏:
问题是当这个工具提示窗口出现时,它会导致另一种形式(frmMain,模态的)出现。它不会获得激活焦点;但它现在确实掩盖了我正在查看的表格:
原因可能是合乎逻辑的。Delphi HintWindow可能由Application.Handle
或拥有Application.MainForm.Handle
,而不是由它应该拥有的表单拥有:
我会认为这是德尔福的一个错误。使用错误的所有者。
转移看实际的应用布局
现在重要的是我要花一点时间来证明我的应用程序不是主窗体和无模式窗体:
其实是:
- 登录屏幕(一个被隐藏的牺牲主窗体)
- 一个主屏幕
- 模态控制面板
- 显示无模式形式
即使在应用程序布局的现实情况下,除了提示窗口所有权之外的一切都有效。有两个任务栏按钮,单击它们会显示正确的表单:
但是我们仍然有 HintWindow 所有权带来错误形式的问题:
ShowMainFormOnTaskbar
当我意识到我做不到时,我正试图创建一个最小的应用程序来重现问题。有一些不同的东西:
- 在我的 Delphi 5 应用程序移植到 XE6 之间
- 在 XE6 中创建的新应用程序
在比较了所有内容之后,我最终将其追溯到 XE6 中的新应用程序MainFormOnTaskbar := True
在任何新项目中默认添加的事实(大概不会破坏现有应用程序):
当我添加此选项时,工具提示的出现并没有带来错误的形式!:
成功!除了,知道会发生什么的人知道会发生什么。我的“牺牲”主登录表单显示“真实”主表单,隐藏自己:
当这种情况发生时,我“登录”,我的任务栏图标完全消失:
发生这种情况是因为:
- 未拥有的牺牲主形式不是不可见的:所以按钮随之而来
- 真正的主窗体是拥有的,因此它没有工具栏按钮
使用 WS_APP_APPWINDOW
现在我们有机会使用WS_EX_APPWINDOW
. 我想强制我拥有的主窗体出现在任务栏上。所以我覆盖CreateParams
并强制它出现在任务栏上:
我们试一试:
看起来还不错!
- 两个任务栏按钮
- 工具提示不会向前弹出错误的所有者表单
除了,当我点击第一个工具栏按钮时,会出现错误的表单。它显示模态frmMain,而不是当前模态frmControlPanel:
大概是因为新创建的frmControlPanel是 PopupParented 到Application.MainForm而不是Screen.ActiveForm。签入间谍++:
是的,父母是MainForm.Handle
。这原来是因为 VCL 中的另一个错误。如果表格PopupMode
是:
- pmAuto
- pmNone(如果是模态形式)
VCL 尝试Application.ActiveFormHandle
用作hWndParent
. 不幸的是,它会检查模态表单的父级是否已启用:
当然,模态表单的父级未启用。如果是,它就不是模态形式。所以 VCL 回退到使用:
手动育儿
这意味着我可能必须确保手动(?)设置弹出育儿?
除了那也没用。单击第一个任务栏按钮会导致激活错误的表单:
在这一点上,我彻底糊涂了。我的模态表单的父级应该是frmMain,它是!:
所以现在怎么办?
我对可能发生的事情有预感。
该任务栏按钮是frmMain的表示。Windows 正在推动这一点。
除非它在MainFormOnTaskbar设置为 false 时表现正确。
Delphi VCL 中一定有一些魔法导致之前的正确性,但被MainFormOnTaskbar := True禁用,但它是什么?
我不是第一个希望 Delphi 应用程序与 Windows 95 工具栏配合得很好的人。我过去曾问过这个问题,但这些答案总是面向 Delphi 5,它是旧的中央路由窗口。
有人告诉我,一切都在 Delphi 2007 时间范围内得到修复。
那么正确的解决方案是什么?
奖金阅读
python-2.7 - 在 windows 95 上的 python 2.7 上安装包
我在这里找到了适用于 windows 9x 的 python 2.7.3 版本。 http://www.msfn.org/board/topic/162317-python-27-for-windows-95/
并下载它以在我的 Windows 95 笔记本电脑上使用。我意识到这是不寻常的,所以遇到问题并不奇怪,但是它并没有出现在 pip 中,所以我无法安装任何新软件包。我曾尝试运行 get-pip.py,但由于“AttributeError:未找到函数‘SHGetFolderPathW’,当 get-pip.pt 尝试使用ctypes 中的init .py 时,这在取得一些进展后失败。SHGetFolderPathW 是 shell32 支持的东西。在 windows 2000 及以后的版本中,我相信相当于 shfolder.dll 中的 SHGetFileInfo。
我不知道如何替换试图调用 SHGetFolderpathW 的代码部分并替换它,以便 pip 安装(或至少更进一步)。
我希望有人可以提供帮助,尽管我意识到这是一个非常小众的问题。
python - 如何在 Windows 95 环境下运行的 Python 2.5.4 版本上安装 PIP?
语境
我被限制在 Windows 95 环境中使用 Python 2.5.4 并且需要 PIP。那些运行早于 2.7.9 的版本(之后预安装了 PIP)应该能够按照此链接中的说明安装 PIP 。
障碍
问题是上一个链接中引用的文件get-pip.py是用 python 3 语法编写的,因此在运行时它会在 2.5.4 解释器中引发大量 SyntaxErrors。
我已经尝试过的
我设法重构了 get-pip.py,它成功运行,直到它开始在执行从二进制 blob 派生的代码时抛出更多 SyntaxErrors,我无法重构。
根据这篇文章中的建议,我尝试通过包含的 Setup.py 脚本从其解压缩的 tar 文件(指向兼容的 PIP tar 的链接)中安装其他库,包括 PIP 包管理器。在 PIP 的情况下,这会抛出ImportError: No module named setuptools
. 我尝试通过按照 Windows 的说明(链接)安装兼容版本的 setuptools 来解决此问题,但由于与socket.py
. 等等等等。
结论
在带有 Python 2.5.4 的 Windows 95 中甚至可以使用 PIP 吗?如果有人帮助我停止希望它是可能的,我会放手继续前进;但事实上,我已经花了 19 个小时的时间来解决这个难题,但几乎没有什么可展示的。请帮忙!
windows - 有什么方法可以在 Windows 95/98 中禁用和启用设备?
我有一台安装了 Windows 95/98 的旧工业 PC。出于某种原因,我需要一个可以禁用、等待几秒钟然后启用设备(串行端口控制器)的脚本或实用程序。我可以使用 Windows 设备管理器手动执行此操作,选中“在此硬件配置文件中禁用”复选框,按 OK,然后取消选中此复选框。有什么方法可以从命令行或使用 WinAPI 做到这一点?谢谢。
c++ - 是否不能在 Windows 95 和 Windows NT 4.0 中运行已编译的 C++ 应用程序?
每当我使用 MinGW 编译 C++ 应用程序时,它们都可以在现代版本的 Microsoft Windows 中正常工作,包括 Windows 2000 和 Windows XP。
但是,当我尝试在 Windows 95 和 Windows NT 4.0 上运行它们时,我收到以下错误:
这是否意味着这些版本根本不支持运行已编译的 C++ 应用程序的想法?
注意:我还没有测试过Windows 98 和Windows ME。
编辑:我已经测试了 Windows 98。testsortingvisualization运行正常,但是tetrisimplementation显示一个空白的命令提示符并且不会停止。这两个程序都给出了上面在 Windows 95 和 Windows NT 4.0 中给出的完全相同的错误。请记住,Windows 2000 可以同时正确运行。
编辑:微软声称我使用的一些功能(WriteConsoleOutput、GetAsyncKeyState)对 Windows 2000 有最低要求。事实上,它经过测试不能在 Windows 98 中工作。我还没有找到一种更兼容的方式来进行控制台输出(系统8 位代码页、80 列、25 行、16 色)或按键检测。
MSVCRT.DLL 故障:DLL 是已编译 C++ 应用程序的关键依赖项,因此根本不可能在 Windows 95 上运行任何已编译 C++ 应用程序。
我还没有找到 NT 4.0 问题的解释。
batch-file - 变量中的 Windows 9x/Me 版本
您如何将 Windows 9x/Me 版本存储到变量中?