Meh*_*dad 6 winapi sendmessage
以下程序关闭显示器.它有时会在我运行时崩溃,有时则不然.反汇编只是指向一个随机位置0x00011000,并且没有真实的信息.
如果我重新编译程序并运行它,重新编译的版本运行正常,而我正在测试它.但是下次我真的需要使用它时,它会再次崩溃,我需要重新编译它...让我后悔做这件事.
我不知道如何一致地重现错误.(也就是说,除了在最迫切需要它并且看着它崩溃时运行它.)
#include <Windows.h>
#include <tchar.h>
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
return SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Windows 7 x64,并将其编译为32位程序.我相信我已经尝试了64位同样的东西,并得到了相同的结果,虽然我不是100%肯定.
如果有人真的复制了这个,请发表评论让我知道,我很好奇其他人是否可以重现这一点.
我目前正在测试一个稍微修剪一下的版本(它不依赖于C运行时):
#include <Windows.h>
#pragma comment(linker, "/NoDefaultLib")
#pragma comment(linker, "/Entry:mainCRTStartup")
#pragma comment(linker, "/Subsystem:Windows")
int mainCRTStartup()
{
return SendMessageW(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2);
}
/*
Base64 version of this program, in case you want to use it:
TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAAABkN3fRfGzjEXxs4xF8bOMhv7ujEbxs4xF8bKMRPGzjIb+0IxE8bOMhv7pjETxs4xSaWNoRfGzjAAAAAAAAAAAUEUAAEwBAQBYIgROAAAAAAAAAADgAA8BCwEHCgACAAAAAAAAAAAAAAgQAAAAEAAAACAAAAAAQAAAEAAAAAIAAAQAAAAAAAAABAAAAAAAAAAAIAAAAAIAAAAAAAACAAAEAAAQAAAQAAAAABAAABAAAAAAAAAQAAAAAAAAAAAAAAAoEAAAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAudGV4dAAAAHQAAAAAEAAAAAIAAAACAAAAAAAAAAAAAAAAAAAgAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYEAAAAAAAAGoCaHDxAABoEgEAAGj//wAA/xUAEEAA99gbwPfYw8zMUBAAAAAAAAAAAAAAaBAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgQAAAAAAAAQgJTZW5kTWVzc2FnZVcAAFVTRVIzMi5kbGwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
*/
Run Code Online (Sandbox Code Playgroud)
目前,这个版本有效...但是,当我重新编译它时,前一个版本也是如此.如果事实证明这个没有崩溃,我会在这里发布.
如果您想重现这一点,我的建议是:编译程序,让它腌制一两天.:)当您使用计算机一段时间后,尝试运行该程序几次...当我尝试时,我通常会收到错误,直到我重新编译程序.
出于某种原因,每当你想向人们展示问题时,它就会神奇地得到解决.在这里同样的情况.我将继续尝试重现错误,但此刻,似乎工作正常.:\(我怀疑它可能是因为安装了Windows 7 SP1,但我真的很怀疑......如果我发现我会发布在这里.)
对不起这个人...
好的...当它发生时,无论何时你需要重现一个bug,你都不能.:|
但是,至少我发现了其他东西:似乎发送消息的正确窗口是返回的窗口GetShellWindow().希望这对其他人有用.
也许你已经看过这个了,但是Windows 大神 Raymond Chen 这篇文章的要点是,不建议以这种方式使用 HWND_BROADCAST。我通过一个不应命名的网站上的评论发现了这一点,大意是您在这里使用的示例代码虽然很受欢迎,但并不是处理显示器断电的正确方法。
这并不能解释为什么您所看到的正是您所看到的,但它确实提供了一些证据表明相关代码是可疑的。
| 归档时间: |
|
| 查看次数: |
856 次 |
| 最近记录: |