![](/img/trans.png)
[英]How to programatically hinder Windows from playing "Default Beep" sound when user clicks on disabled window (disabled via EnableWindow(hwnd, FALSE))?
[英]EnableWindow(hWnd, false) doesn't disable keyboard input
我试图在某些情况下使用EnableWindow(hWnd, false);
禁用窗口EnableWindow(hWnd, false);
根据文档 ,这应该“禁用对指定窗口的鼠标和键盘输入”。
我所看到的问题是,实际上,它确实像它说的那样禁用,除非光标当前位于窗口中的文本框中,并且窗口具有未禁用的焦点。 我当时正在考虑做某种代码来将焦点从窗口移开。
有没有更好的方法来解决这个问题?
注意:禁用的窗口是通过_spawnl()
进行的二进制运行。
我不确定这是Windows功能还是bug。 无论哪种方式,禁用前景窗口都不是一个好主意。
如果您能够修改程序,则以_spawnl()
开始,那么这是一个更好的解决方案。 您可以在需要控制它时使其响应WM_APP或类似的响应。
如果它是第三方应用程序,那么您将遭受黑客攻击。
您可以尝试使用SetForegroundWindow
更改前台窗口,但这仅在_spawnl()
之后不久在线程丢失前台锁之前执行此操作才有效。 在_spawnl()
之前使用LockSetForegroundWindow
可能可以帮助您将锁保持更长的时间。 还有其他各种技巧可以通过AttachThreadInput
等更改前景。
如果您不想更改前景,我可以提供一种解决方法:
ShellExecute(NULL, NULL, TEXT("Notepad"), NULL, NULL, SW_SHOW);
Sleep(2000);
HWND hNP = FindWindow(TEXT("Notepad"), NULL);
Sleep(2000); // Start typing in Notepad now...
if (hNP)
{
DWORD tid = GetWindowThreadProcessId(hNP, NULL);
GUITHREADINFO gti;
gti.cbSize = sizeof(gti);
if (tid && GetGUIThreadInfo(tid, >i))
{
HWND hChild = NULL;
if (gti.hwndFocus != hNP && gti.hwndFocus)
{
EnableWindow(hChild = gti.hwndFocus, false);
}
if (GetForegroundWindow() == hNP)
{
SendNotifyMessage(hNP, WM_ACTIVATE, WA_INACTIVE, NULL);
SendNotifyMessage(hNP, WM_ACTIVATE, WA_ACTIVE, NULL);
SendNotifyMessage(hNP, WM_SETFOCUS, NULL, NULL);
// SendNotifyMessage(hNP, WM_NCACTIVATE, false, NULL); // Uncomment to make it look like it is inactive
}
EnableWindow(hNP, false);
if (hChild)
{
EnableWindow(hChild, true);
}
}
MessageBox(NULL, TEXT("Done?"), NULL, MB_TOPMOST);
SetForegroundWindow(hNP);
PostMessage(hNP, WM_CLOSE, 0, 0);
}
这当然不是最佳选择,它使记事本处于看起来已启用但实际上不是的状态。 这个想法是禁用聚焦的子窗口并触发伪激活更改并强制更改焦点。 知道,它可能无法与其他应用程序一起使用。
如果您愿意冒险陷入僵局,可以这样做:
DWORD tid = GetWindowThreadProcessId(hNP, NULL);
GUITHREADINFO gti;
gti.cbSize = sizeof(gti);
if (tid && GetGUIThreadInfo(tid, >i))
{
if (GetForegroundWindow() == hNP)
{
if (AttachThreadInput(GetCurrentThreadId(), tid, true))
{
SetFocus(NULL);
AttachThreadInput(GetCurrentThreadId(), tid, false);
}
}
EnableWindow(hNP, false);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.