अग्रभूमि (डेल्फी) में विंडो सेट करने में असमर्थ

Dec 28 2020

यहां वह कोड है जिसका उपयोग मैं एक विंडो को फोरग्राउंड में पुनर्स्थापित करने और सेट करने के लिए करता हूं। जब खिड़की को छोटा किया जाता है, तो कोड पूरी तरह से काम करता है लेकिन जब खिड़की कुछ अन्य खिड़कियों के पीछे छिप जाती है, तो मैं खिड़की को अग्रभूमि में नहीं ला सकता हूं, बाद में मुझे पता चला कि SetForegroundWindow(Handle)झूठे वापस आ रहे हैं। हालाँकि, यदि मैं डिबगिंग मोड में प्रोग्राम चलाता हूं, तो विंडो को अग्रभूमि में लाया जा सकता है। मुझे यह पता नहीं लग सकता है कि ऐसा क्यों हो रहा है।

function EnumWindowsCallback(Handle: HWND; lParam: Integer): bool; stdcall;
var
  WID, PID: Integer;
begin
  WID := 0;
  PID := lParam;
  GetWindowThreadProcessId(Handle, @WID);
  if (PID = WID) and IsWindowVisible(Handle) then begin
    ShowWindow(Handle, SW_RESTORE);
    SetForegroundWindow(Handle);
    FlashWindow(Handle, True);
  end;
  Result := True;
end;

function ShowProcessWindow(PID: Integer): boolean;
begin
  Result := EnumWindows(@EnumWindowsCallback, lParam(PID))
end;

जहां पीआईडी ​​खिड़की की प्रक्रिया आईडी है जिसे मैं पुनर्स्थापित करना चाहता हूं और अग्रभूमि में सेट करना चाहता हूं।

अद्यतन: मैंने अभी इसे प्रलेखन में पढ़ा है । क्या यह संबंधित हो सकता है?

जब उपयोगकर्ता किसी अन्य विंडो के साथ काम कर रहा हो, तो कोई एप्लिकेशन किसी विंडो को अग्रभूमि पर बाध्य नहीं कर सकता है। इसके बजाय, विंडोज उपयोगकर्ता को सूचित करने के लिए विंडो के टास्कबार बटन को फ्लैश करता है।

जवाब

1 JiaLin Dec 29 2020 at 10:09

मैं SetForegroundWindow(Handle)कोड की follwoing 2 लाइनों के साथ बदल दिया है और यह मेरी साइट पर काम करता है:

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);