使用德尔福2007 ... 我有一个应用程序,它只使用一个互斥体来强制执行一个运行实例。在dpr单元中,如果互斥锁已经存在,我可以使用FindWindow
获得正在运行的实例的句柄,至今没有问题。第二个实例通常由虚拟打印机驱动程序参考命令行上的文件名启动。如果有一个命令行文件引用,那么我只想将消息发布到正在运行的实例并暂停新实例。调用postmessage返回“访问被拒绝”
我使用这个......
PostMessage(hwnd,WM_STARTUP_MESSAGE,0,0); //hwnd as returned by FindWindow
WM_STARTUP_MESSAGE
被定义为WM_APP + 6057
我与该WM_STARTUP_MESSAGE
没有在主线程中处理问题的一个用户。从DPR单元记录的启动信息,它表明了PostMessage
返回false和SysErrorMessage(GetLastError)
是:
Zugriff verweigert (his windows german translation is Access Denied).
我有这个应用程序的许多,许多用户和我只有这个问题的2份报告,在这里无法重现。在Windows 10这里,至少有一个问题用户,另一个我不确定。
我在主窗体的OnCreate
中使用ChangeWindowMessageFilterEx
以允许WM_COPYDATA
。我的想法是简单地包含WM_STARTUP_MESSAGE
,但这会导致崩溃,因为该函数不喜欢该消息索引值,所以我认为它是为特定范围的消息值保留的。
有没有人看过这个之前,可以提供一些指导?
如果在Windows启动时(通过注册表RUN)项中的应用程序运行时,它在更高的完整性级别运行? –
它以用户的正常(中等)完整性级别运行,除非可执行文件已用'icacls'标记了不同的完整性级别,或者具有UAC提升清单。此外,如果恶意应用程序可以简单地将自己放入Run键并在未经用户许可的情况下自动获得高完整性访问权,那么您不认为这会是安全漏洞吗? –
@John - 如果您的应用程序的第一个实例没有以更高的权限运行,那么您根本不需要调用ChangeWindowMessageFilterEx。 –