本帖最后由 slore 于 2018-1-3 23:25 编辑 取了屏幕分辨率,再取显示器分辨率,moniX*96/scrnX就可以。pecmd怎么取我不清楚,C/C++的代码网上一大堆,就5,6行代码。 不知道为啥,啥都要塞到pecmd里面?这种与PE无关的东西,还是找更广泛使用的语言吧,共享信息多,又能自己解决。 |
527104427 发表于 2018-1-5 00:39 受教了。。。 不知道能不能用pecmd或者别的方法来设置DPI呢? |
527104427 发表于 2018-1-6 22:56 这个api好像win8以上才能用吧 |
sp_star 发表于 2018-1-6 18:55 多谢老大指点,又学了一招 |
527104427 发表于 2018-1-6 17:31 用API设置也是可以的。 CALL $--ret:&DPI_Aware user32.dll,SetProcessDPIAware //设置DPI-aware |
微软说,要在 manifest 加一段,才能感知DPI: <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>Per monitor</dpiAware> </asmv3:windowsSettings> </asmv3:application> |
slore 发表于 2018-1-6 10:40 pecmd在win10下也一直是96的值 |
红毛樱木 发表于 2018-1-6 03:48 WINDOWS下运行pecmd,交互里面写这个函数,改变DPI能返回变动后的正确DPI,但是VS2015里面一直是96,所以采用分辨率进行运算的。 就是类似获取系统信息的,搜C/C++代码,看用的什么函数,然后MSDN查找是那个DLL,转换吧,我是觉得直接用C方便,代码干净。 |
slore 发表于 2018-1-5 02:02 10下一直是96是正常的。这个值不是用在10的默认DPI方式了。 |
sp_star 发表于 2018-1-5 16:24 可以。 |
红毛樱木 发表于 2018-1-5 01:06 试试
|
参与人数 1 | 无忧币 +5 | 收起 理由 |
---|---|---|
freesoft00 | + 5 |
本帖最后由 slore 于 2018-1-5 02:03 编辑 8楼的代码的话,是下面这个样子。
不是很理解能用PECMD,不能用C。 |
参与人数 1 | 无忧币 +5 | 收起 理由 |
---|---|---|
freesoft00 | + 5 |
红毛樱木 发表于 2018-1-5 01:06 GetDPI.c
pecmd脚本不会,你看能调用API的话,参照吧。 E:\Test>GetDPI1.exe 96 E:\Test>echo %errorlevel% 96 附件是把代码的96改成100,得到 系统设定的百分比,100%(96 DPI), 125%(120 DPI), 150%(144 DPI), 175%(168 DPI)。 你清楚你要百分比,还是要具体的DPI值,自己根据情况改下吧。 E:\Test>GetDPI2.exe 100 E:\Test>echo %errorlevel% 100 |
slore 发表于 2018-1-3 22:06 老大说的在理,可是我不会玩。 只能玩玩pecmd脚本的套用 |
527104427 发表于 2018-1-5 00:39 翻译的666,我的学会你这招套用大法。 |
本帖最后由 527104427 于 2018-1-8 00:54 编辑 方法一: // 检索显示设备上下文环境的句柄 CALL $--ret:&hdc user32.dll,GetDC,#0 // 当前系统DPI_X 大小 一般为96 CALL $--ret:&LOGPIXELSX Gdi32.dll,GetDeviceCaps,#%hdc%,#88 // 当前系统DPI_Y 大小 一般为96 CALL $--ret:&LOGPIXELSY Gdi32.dll,GetDeviceCaps,#%hdc%,#90 // 获取屏幕分辨率当前物理大小 CALL $--ret:&HORZRES Gdi32.dll,GetDeviceCaps,#%hdc%,#8 //宽 CALL $--ret:&VERTRES Gdi32.dll,GetDeviceCaps,#%hdc%,#10 //高 // 获取真实设置的桌面分辨率大小 CALL $--ret:&DESKTOPHORZRES Gdi32.dll,GetDeviceCaps,#%hdc%,#118 //宽 CALL $--ret:&DESKTOPVERTRES Gdi32.dll,GetDeviceCaps,#%hdc%,#117 //高 // 获取宽度缩放百分比 IFEX $%&LOGPIXELSX%=96, CALC &ScaleX=round(%&DESKTOPHORZRES%/%&HORZRES%*100)! CALC &ScaleX=round(%&LOGPIXELSX%/96*100) // 获取高度缩放百分比 IFEX $%&LOGPIXELSY%=96, CALC &ScaleY=round(%&DESKTOPVERTRES%/%&VERTRES%*100)! CALC &ScaleY=round(%&LOGPIXELSY%/96*100) //如果DPI为96,且缩放百分比不是100%,则重新计算DPI IFEX $[ %&LOGPIXELSX%=96 & %&ScaleX%<>100 ], CALC &LOGPIXELSX=round(%&DESKTOPHORZRES%/%&HORZRES%*96) IFEX $[ %&LOGPIXELSY%=96 & %&ScaleY%<>100 ], CALC &LOGPIXELSY=round(%&DESKTOPVERTRES%/%&VERTRES%*96) MESS 水平方向DPI:[%&LOGPIXELSX%] 缩放百分比:[%&ScaleX%%%] 垂直方向DPI:[%&LOGPIXELSY%] 缩放百分比:[%&ScaleY%%%] 方法二: CALL $--ret:&DPI_Aware user32.dll,SetProcessDPIAware // 设置DPI-aware,用于感知 DPI CALL $--ret:&hdc user32.dll,GetDC,#0 CALL $--ret:&LOGPIXELSX Gdi32.dll,GetDeviceCaps,#%hdc%,#88 CALC &ScaleX=round(%&LOGPIXELSX%/96*100) MESS DPI:[%&LOGPIXELSX%] 缩放百分比:[%&ScaleX%%%] 不谢 |
参与人数 2 | 无忧币 +10 | 收起 理由 |
---|---|---|
金 | + 5 | 很给力! |
freesoft00 | + 5 |
红毛樱木 发表于 2018-1-3 08:22 不好意思!我看错了!这个不是屏幕分辨率! |
ge 发表于 2018-1-3 00:31 scrn怎么获取DPI啊? |
┃ │命令│'SCRN' ┃ ┃ ├──┼──────────────────────────────────────────────┨ ┃ │格式│SCRN [-win] [W变量名][,H变量名][,x变量名][,y变量名][,任务栏位置名] ┃ ┃ │ │SCRN -cap[gui] [:格式:][文件名],[#窗口ID|<x:y:R:B>] //屏幕捕捉 格式如:image/png ┃ ┃ ├──┼──────────────────────────────────────────────┨ ┃ │功能│返回屏幕当前的宽和高。-win则为最大窗口大小。 ┃ ┃ ├──┼──────────────────────────────────────────────┨ ┃SCRN│参数│■变量名: 用于保存屏幕当前宽和高的变量名; ┃ ┃ ├──┼──────────────────────────────────────────────┨ ┃ │示例│SCRN ScrW,ScrH 或 SCRN -cap a.bmp,0 或 SCRN -cap win.bmp,#1181336 ┃ ┃ ├──┼──────────────────────────────────────────────┨ ┃ │备注│※变量名不能和已存在的变量名相同,当命令出错时两变量的返回结果均为空值或数值0 ┃ ┃ │ │※屏幕捕捉:位置参数>=1则捕捉。无位置参数和窗口ID则获取先前的保存。无文件名则留到下次来取 |
freesoft00 发表于 2018-1-2 19:23 10没有 |
HKEY_CURRENT_USER\Control Panel\Desktop LogPixels键值 |
Powered by Discuz! X3.3
© 2001-2017 Comsenz Inc.