使用德爾福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。 –