解决WIN10PE中WIN+D显示桌面问题
本帖最后由 haijie1223 于 2017-8-9 08:01 编辑看到这个源码:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=387383
不懂易语言,还是用其它的办法实现吧。
1、PECMD命令:
每次刷新explorer之后,运行下面这个命令,当然开机第一次进入桌面也要运行。
CALL $--ret:hHwnd user32.dll,FindWindowW,Shell_TrayWnd,
CALL $user32.dll,SendMessageW,#%hHwnd%,#1466,#0,#0
2、AU3写法:
#NoTrayIcon
Local $Msg=_RegisterWindowMessage('TaskbarCreated')
GUICreate('')
GUISetState(@SW_HIDE)
GUIRegisterMsg($Msg,'_ShowDeskTopMsg')
_ShowDeskTopMsg()
While 1
Sleep(10)
WEnd
Func _ShowDeskTopMsg()
_SendMessage(WinGetHandle(''), 1466, 0, 0)
EndFunc
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
If @error Then Return SetError(@error, @extended, "")
If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
Return $aResult
EndFunc ;==>_SendMessage
Func _RegisterWindowMessage($sMessage)
Local $aResult = DllCall("user32.dll", "uint", "RegisterWindowMessageW", "wstr", $sMessage)
If @error Then Return SetError(@error, @extended, 0)
Return $aResult
EndFunc ;==>_WinAPI_RegisterWindowMessage
本帖最后由 tools241 于 2017-8-7 17:52 编辑
请问要如何执行? 在何处执行?
tools241 发表于 2017-8-7 07:16
请问要如何执行? 在何处执行?
用AU3进行编译成exe,进入PE后运行。 大师 能不能提供一个编译好的成品 下载了autoit3 实在不知道怎么用 看见有人要编译好的,顺手编译给需要的人!
xzf680 发表于 2017-8-7 10:12
看见有人要编译好的,顺手编译给需要的人!
这个可用于32位和64位的PE?
里面有32位和64位,其实32位就可以通用了。 whyme22 发表于 2017-8-7 09:05
大师 能不能提供一个编译好的成品 下载了autoit3 实在不知道怎么用
7楼自己下 xmzhqw 发表于 2017-8-7 11:24
这个可用于32位和64位的PE?
7楼 haijie1223 发表于 2017-8-7 14:37
7楼自己下
谢谢 测试结果:
1.showdesktop*.exe 只能在 *.ini 最后执行, 否则会卡住.
2.showdesktop*.exe 常驻吃CPU, 但执行后可 kill showdesktop*
建议: 执行 showdesktop*.exe 不要常驻记忆体, 執行後能自行结束.
tools241 发表于 2017-8-7 17:54
测试结果:
1.showdesktop*.exe 只能在 *.ini 最后执行, 否则会卡住.
2.showdesktop*.exe 常驻吃CPU, 但执 ...
点评到位,可以去掉while循环,然后每次刷新explorer之后,执行一次sendmessage即可。 本帖最后由 tools241 于 2017-8-8 11:18 编辑
haijie1223 发表于 2017-8-7 23:43
点评到位,可以去掉while循环,然后每次刷新explorer之后,执行一次sendmessage即可。
大大是否会重新上传新档?
3Q!
tools241 发表于 2017-8-8 08:57
大大是否会重新上传新档?
3Q!
现在一直运行应该不吃CPU了 本帖最后由 tools241 于 2017-8-11 20:21 编辑
haijie1223 发表于 2017-8-8 09:49
现在一直运行应该不吃CPU了
收下了, 3Q!
tools241 发表于 2017-8-8 11:10
收下了, 3Q!
2017/08/08 11:25 本人已添加的热键到所发的10PE (只须更新Seltool_T.7z ; *.iso ...
这是修改后的源码
#NoTrayIcon
Local $Msg=_RegisterWindowMessage('TaskbarCreated')
GUICreate('')
GUISetState(@SW_HIDE)
GUIRegisterMsg($Msg,'_ShowDeskTopMsg')
While 1
Sleep(10)
WEnd
Func _ShowDeskTopMsg()
_SendMessage(WinGetHandle(''), 1466, 0, 0)
EndFunc
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
If @error Then Return SetError(@error, @extended, "")
If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
Return $aResult
EndFunc ;==>_SendMessage
Func _RegisterWindowMessage($sMessage)
Local $aResult = DllCall("user32.dll", "uint", "RegisterWindowMessageW", "wstr", $sMessage)
If @error Then Return SetError(@error, @extended, 0)
Return $aResult
EndFunc ;==>_WinAPI_RegisterWindowMessage 本帖最后由 tools241 于 2017-8-8 22:12 编辑
haijie1223 发表于 2017-8-8 12:03
这是修改后的源码
1.*.exe 只能在 *.ini 最后执行, 否则会卡住 -- 此点是否无解? 不执行 while 不行?
2.*.exe 执行后须kill explorer -- 否则按可能无效
如果只保留下列三行, 会有什么影响? 如果由使用者自行多执行 *.EXE 几次是否行?
[*]#NoTrayIcon
[*]#include <Winapi.au3
[*] _SendMessage(_WinAPI_FindWindow('Shell_TrayWnd', ''), 1466, 0, 0)
tools241 发表于 2017-8-8 21:49
1.*.exe 只能在 *.ini 最后执行, 否则会卡住 -- 此点是否无解? 不执行 while 不行?
2.*.exe 执行后须k ...
1、按说是不会卡住的,你写pecmd命令的时候,不要等待程序运行完毕。把exec的“=”参数去掉。
2、必须先kill explorer是因为代码中漏掉了一行。抱歉,我没有实际测试,所以会有纰漏。
#NoTrayIcon
Local $Msg=_RegisterWindowMessage('TaskbarCreated')
GUICreate('')
GUISetState(@SW_HIDE)
GUIRegisterMsg($Msg,'_ShowDeskTopMsg')
_ShowDeskTopMsg()
While 1
Sleep(10)
WEnd
Func _ShowDeskTopMsg()
_SendMessage(WinGetHandle(''), 1466, 0, 0)
EndFunc
Func _SendMessage($hWnd, $iMsg, $wParam = 0, $lParam = 0, $iReturn = 0, $wParamType = "wparam", $lParamType = "lparam", $sReturnType = "lresult")
Local $aResult = DllCall("user32.dll", $sReturnType, "SendMessageW", "hwnd", $hWnd, "uint", $iMsg, $wParamType, $wParam, $lParamType, $lParam)
If @error Then Return SetError(@error, @extended, "")
If $iReturn >= 0 And $iReturn <= 4 Then Return $aResult[$iReturn]
Return $aResult
EndFunc ;==>_SendMessage
Func _RegisterWindowMessage($sMessage)
Local $aResult = DllCall("user32.dll", "uint", "RegisterWindowMessageW", "wstr", $sMessage)
If @error Then Return SetError(@error, @extended, 0)
Return $aResult
EndFunc ;==>_WinAPI_RegisterWindowMessage
3、如果你只需要每次刷新explorer之后运行一次的话,可以只保留两行代码:
#NoTrayIcon
_SendMessage(WinGetHandle(''), 1466, 0, 0) 本帖最后由 tools241 于 2017-8-11 20:21 编辑
haijie1223 发表于 2017-8-9 00:09
1、按说是不会卡住的,你写pecmd命令的时候,不要等待程序运行完毕。把exec的“=”参数去掉。
2、必须先 ...
问题都完美解决了, 3Q!
2017/08/09 07:20 本人已添加的热键到所发的10PE (只须更新Seltool_T.7z ; *.iso不用更新), 并注明出处 :
8/9更新 效率极致!简体/繁体 10PE16199x64 10PE16193x86 10PE15063x64影音上网版 ==>
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=385866
tools241 发表于 2017-8-9 06:26
问题都完美解决了, 3Q!
看1楼,我又添加了pecmd的方法。 haijie1223 发表于 2017-8-9 08:01
看1楼,我又添加了pecmd的方法。
一楼的代码是最新的吗 freesoft00 发表于 2017-8-11 17:50
一楼的代码是最新的吗
是的 freesoft00 发表于 2017-8-11 17:50
一楼的代码是最新的吗
是的 感谢分享,试试楼主的代码。 提示一下,最新826版的PECMD隐含解决了这个问题。如果以PECMD这个作为启动器的PE可以不考虑这个问题了。 hhh333 发表于 2017-8-27 08:03
提示一下,最新826版的PECMD隐含解决了这个问题。如果以PECMD这个作为启动器的PE可以不考虑这个问题了。
666
ShowDesktop x86/x64 轻的 PureBasic (with source | 与来源)
ShowDesktop.exe
ShowDesktop.exe -p (permanent | 永久)
厉害厉害!太实用了! 本帖最后由 foxfirefox 于 2018-8-30 20:03 编辑
直接用1楼的第一中代码就很好,system用户,刷新explorer代码为
kill explorer
wait 1000
CALL $--ret:hHwnd user32.dll,FindWindowW,Shell_TrayWnd,
CALL $user32.dll,SendMessageW,#%hHwnd%,#1466,#0,#0
administrator用户将 1000改为 3000,双切用户就麻烦好多。 大神
页:
[1]
2