簡體   English   中英

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, &gti))
    {
      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, &gti))
    {
      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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM