为什么python的win32gui.SendMessage超时失败并删除我的大部分环境变量?

2024-05-03 19:06:19 发布

您现在位置:Python中文网/ 问答频道 /正文

这个代码片段非常标准:(你可以在许多网站上找到它)

rc, dwReturnValue = win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Environment", win32con.SMTO_ABORTIFHUNG, 5000 )

在一台机器上,它会删除大部分(但不是全部)环境变量: 这些变量将被删除:(和其他变量)

^{pr2}$

当我说deleted时,我的意思是原始shell有一个完整的环境,但是所有后续的环境shell都没有这些环境变量,至少可以说,这“有点”麻烦。在

我已经在至少4台其他机器上尝试过这个代码,没有问题。代码运行得很好。在

在一台有问题的机器上,注销/登录似乎可以解决问题(并恢复丢失的env vars)

我在万能的google上做了很多研究,没有发现win32方法的错误gui.SendMessage超时 只在未正确调用方法的人上找到线程。(也许这条线会加入这些行列!:))

我一直在运行spy++(我是一个spy++noob),可以看到WM_SETTINGCHANGE消息被有问题的机器上的几个不同窗口正确接收。在

print str(rc),"<- return code"
print str(dwReturnValue), "<- return value"

收益率

1 <- return code
0 <- return value

以下是我的设置:

  • 操作系统-Windows 7
  • python 2.7.1
  • 赛文19.5

过程是 批处理文件(批处理文件)(设置%CYGWIN_ROOT%)

(...)
:BASH_INSTALL_SCRIPT
::write paths file that will be used to modify system paths
set PATH=%CYGWIN_ROOT%\bin;%PATH%
::call bash install sequence
"%BASH_EXE%" install.sh %CYGWIN_ROOT%\bin %*

在安装.sh代码段:

function setCygwinPath {
# Install script of Cygwin set CYGWIN_ROOT in current env variables.
setEnvVar "CYGWIN_PATH" $CYGWIN_ROOT
}

function setEnvVar {
"$PythonRoot/python.exe" ../utils/${project}/setEnvVar.py $1 $2
(...)    }

在设置变量.py在

from install.installUtils import *
setUserEnvVar( sys.argv[1], sys.argv[2])

在installUtils.py在

def setUserEnvVar( varName, content, type=wreg.REG_EXPAND_SZ, override=0 ):
    """ Set the specified environment variable """
    setEnvVarAndBroadcast( wreg.HKEY_CURRENT_USER, getUserEnvKey(), varName, content, type, override )

def setEnvVarAndBroadcast( domain, regKey, varName, content, type=wreg.REG_EXPAND_SZ, override=0 ):
    """ Set an environment variable and broadcast to opened application """
    if override == 0 :
        # If the variable exist reuse its current type
        varInfo = getEnvVarEx( domain, regKey, varName )
        if varInfo[0] <> "" :
            type = varInfo[1]

    key = wreg.OpenKey(domain, regKey, 0, wreg.KEY_WRITE )    
    wreg.SetValueEx( key, varName, 0, type, content)
    wreg.CloseKey( key )

    HWND_BROADCAST = 0xffff
    WM_SETTINGCHANGE = 0x001A
    SMTO_ABORTIFHUNG = 0x0002

    rc, dwReturnValue = win32gui.SendMessageTimeout(win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, "Environment", win32con.SMTO_ABORTIFHUNG, 5000 )

我已经绝对隔离了呼叫win32gui.SendMessage超时是什么破坏了机器的环境变量。在

这段代码之前在这台机器上运行,直到一周前(不知道发生了什么变化;我什么也不说

问题: 这似乎是一种剥削。。。。。。我错了吗? 我真的不知道该调查什么,所以我欢迎一个解决方案(显然),但即使是一个调查的想法也会受到欢迎。我只有32分图形用户界面.pyd(没有来源)在有问题的机器上。在

机器从73个环境变量变为46个(c:>;set)。其中很多是用户安装的应用程序,但有些是系统(如PATH、windir)。在


Tags: 代码机器returntype环境变量contentrcwm