关于#python#的问题:使用ctypes.windll的时候,报错显示如下图,意思是找不到shcore

朋友们,好:
我在win7系统下 ,用python3.8 的 pynput 来自动控制鼠标,有的时候,鼠标不能移动到指定位置

看到说,可以用以下代码可以解决

import ctypes
PROCESS_PER_MONITOR_DPI_AWARE = 2
ctypes.windll.shcore.SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)

我试了上边的代码,报错显示如下图,意思是找不到shcore,我自己搜索了一下,显示有两个原因,也不知道是不是
原因1 python的dll保护机制造成
原因2 调用的dll依赖缺失造成的

我不是学编程的,不知道怎么去具体解决这个事情,
哪位朋友,给看看,怎么解决,
因为我不是学编程的,希望朋友们能给具体代码和具体方法,实现上段代码执行不报错。实现无误自动控制鼠标,谢谢啦

img

win7 不支持 SetProcessDpiAwareness,该 函数从 win8开始支持

win7 使用的是

windll.user32.SetProcessDPIAware()

代码发给我,我编译好发给你

引用chatGPT作答,根据您的问题描述,可能是因为您的Python解释器无法加载"shcore.dll"库文件导致的。这可能是因为您的操作系统中没有该库文件或该文件路径没有添加到您的系统环境变量中。

以下是解决该问题的一些步骤:

1.确认您的系统是否具有 "shcore.dll" 文件。
该文件通常位于 C:\Windows\System32\ 目录下。

2.将该路径添加到您的系统环境变量中,以便 Python 解释器可以找到该文件。
步骤:
a. 在Windows菜单栏上,单击鼠标右键,选择“系统”,然后选择“高级系统设置”。
b. 单击“环境变量”按钮,在“系统变量”下找到“Path”变量,单击“编辑”按钮。
c. 在“变量值”字段中添加 "C:\Windows\System32" 路径,然后单击“确定”按钮保存更改。

3.重新运行您的 Python 脚本,如果一切正常,则不应该再出现 "shcore.dll" 的加载错误。

另外,如果您的 Python 版本较老,您可能需要升级您的 Python 版本以支持最新的 DLL 加载机制。可以尝试升级您的 Python 版本,然后再次运行您的脚本,看看是否能够解决问题。

最后,以下是您可以尝试的代码片段,以确保您的 Python 脚本可以成功加载 "shcore.dll" 文件。

import os
import ctypes

# 确定 shcore.dll 文件的路径
dll_path = os.path.join(os.environ['SystemRoot'], 'System32', 'shcore.dll')

# 尝试加载 DLL 文件并设置 DPI 感知模式
try:
    shcore = ctypes.WinDLL(dll_path)
    PROCESS_PER_MONITOR_DPI_AWARE = 2
    shcore.SetProcessDpiAwareness(PROCESS_PER_MONITOR_DPI_AWARE)
except Exception as e:
    print(f"加载 DLL 文件出现错误: {e}")


以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题是因为你所在的操作系统版本不支持 SetProcessDpiAwareness 函数,可以考虑换一个支持 Dpi Awarness 的操作系统版本。

如果你无法更改操作系统版本,可以尝试用 ctypes 加载 Shcore 库并调用 SetProcessDpiAwareness 函数。以下是一个示例代码:

import ctypes

try:
    ctypes.windll.shcore.SetProcessDpiAwareness(2)
except AttributeError:
    pass # shcore not available, downgrade to GetProcAddress instead

如果你没有 Shcore 库,可以尝试在 Microsoft Download Center 下载并安装 Windows 8.1 SDK

这个问题可能是因为您的操作系统缺少一些必要的DLL文件或者是Python解释器没有足够的权限来访问它们。

您可以尝试以下几个步骤来解决问题:

确认您的操作系统是 Windows 8 或以上版本,因为 SetProcessDpiAwareness 函数需要在这些版本上才能正常工作。

确认您的Python解释器是 64 位版本的,因为 shcore.dll 是一个 64 位 DLL 文件。

将以下代码添加到您的Python脚本中的开头,以确保您的Python解释器具有足够的权限来访问 shcore.dll:

import ctypes
try:
    ctypes.windll.shcore.SetProcessDpiAwareness(True)
except AttributeError:
    pass