haijie1223 发表于 2017-8-7 00:20:45

解决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 07:16:50

本帖最后由 tools241 于 2017-8-7 17:52 编辑

请问要如何执行? 在何处执行?

haijie1223 发表于 2017-8-7 08:27:32

tools241 发表于 2017-8-7 07:16
请问要如何执行? 在何处执行?

用AU3进行编译成exe,进入PE后运行。

whyme22 发表于 2017-8-7 09:05:58

大师 能不能提供一个编译好的成品   下载了autoit3 实在不知道怎么用

xzf680 发表于 2017-8-7 10:12:09

看见有人要编译好的,顺手编译给需要的人!

xmzhqw 发表于 2017-8-7 11:24:29

xzf680 发表于 2017-8-7 10:12
看见有人要编译好的,顺手编译给需要的人!

这个可用于32位和64位的PE?

haijie1223 发表于 2017-8-7 14:36:56


里面有32位和64位,其实32位就可以通用了。

haijie1223 发表于 2017-8-7 14:37:14

whyme22 发表于 2017-8-7 09:05
大师 能不能提供一个编译好的成品   下载了autoit3 实在不知道怎么用

7楼自己下

haijie1223 发表于 2017-8-7 14:37:39

xmzhqw 发表于 2017-8-7 11:24
这个可用于32位和64位的PE?

7楼

whyme22 发表于 2017-8-7 14:42:15

haijie1223 发表于 2017-8-7 14:37
7楼自己下

谢谢

tools241 发表于 2017-8-7 17:54:51

测试结果:
1.showdesktop*.exe 只能在 *.ini 最后执行, 否则会卡住.
2.showdesktop*.exe 常驻吃CPU, 但执行后可 kill showdesktop*

建议: 执行 showdesktop*.exe 不要常驻记忆体, 執行後能自行结束.

haijie1223 发表于 2017-8-7 23:43:59

tools241 发表于 2017-8-7 17:54
测试结果:
1.showdesktop*.exe 只能在 *.ini 最后执行, 否则会卡住.
2.showdesktop*.exe 常驻吃CPU, 但执 ...

点评到位,可以去掉while循环,然后每次刷新explorer之后,执行一次sendmessage即可。

tools241 发表于 2017-8-8 08:57:10

本帖最后由 tools241 于 2017-8-8 11:18 编辑

haijie1223 发表于 2017-8-7 23:43
点评到位,可以去掉while循环,然后每次刷新explorer之后,执行一次sendmessage即可。
大大是否会重新上传新档?
3Q!


haijie1223 发表于 2017-8-8 09:49:02

tools241 发表于 2017-8-8 08:57
大大是否会重新上传新档?
3Q!




现在一直运行应该不吃CPU了

tools241 发表于 2017-8-8 11:10:55

本帖最后由 tools241 于 2017-8-11 20:21 编辑

haijie1223 发表于 2017-8-8 09:49
现在一直运行应该不吃CPU了
收下了, 3Q!


haijie1223 发表于 2017-8-8 12:03:05

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 21:49:51

本帖最后由 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)

haijie1223 发表于 2017-8-9 00:09:12

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-9 06:26:35

本帖最后由 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

haijie1223 发表于 2017-8-9 08:01:52

tools241 发表于 2017-8-9 06:26
问题都完美解决了, 3Q!

看1楼,我又添加了pecmd的方法。

freesoft00 发表于 2017-8-11 17:50:08

haijie1223 发表于 2017-8-9 08:01
看1楼,我又添加了pecmd的方法。

一楼的代码是最新的吗

haijie1223 发表于 2017-8-11 21:27:13

freesoft00 发表于 2017-8-11 17:50
一楼的代码是最新的吗

是的

haijie1223 发表于 2017-8-11 21:27:13

freesoft00 发表于 2017-8-11 17:50
一楼的代码是最新的吗

是的

立帮电子 发表于 2017-8-11 21:59:33

感谢分享,试试楼主的代码。

hhh333 发表于 2017-8-27 08:03:28

提示一下,最新826版的PECMD隐含解决了这个问题。如果以PECMD这个作为启动器的PE可以不考虑这个问题了。

haijie1223 发表于 2017-8-27 20:20:47

hhh333 发表于 2017-8-27 08:03
提示一下,最新826版的PECMD隐含解决了这个问题。如果以PECMD这个作为启动器的PE可以不考虑这个问题了。

666

2011ChrisR 发表于 2017-9-4 22:11:22


ShowDesktop x86/x64 轻的 PureBasic (with source | 与来源)
ShowDesktop.exe
ShowDesktop.exe -p (permanent | 永久)

dsanke 发表于 2018-8-21 01:27:21

厉害厉害!太实用了!

foxfirefox 发表于 2018-8-30 19:59:18

本帖最后由 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,双切用户就麻烦好多。

恋梦ok 发表于 2018-12-6 08:45:00

大神
页: [1] 2
查看完整版本: 解决WIN10PE中WIN+D显示桌面问题