मैं स्क्रीनशॉट लेने के लिए हर घंटे एक थ्रेड कॉल कर रहा हूं। लेकिन समस्या विंडो को सक्रिय करने या विंडो को सामने की ओर ले जाने की है। अगर सामने अन्य ऐप्स हैं तो स्क्रीनशॉट लेते समय वे सामने दिखाई देते हैं। क्या चल रहा है?
<Runtime.InteropServices.DllImport("user32.dll")>
Private Function SetForegroundWindow(ByVal hWnd As IntPtr) As Integer
End Function
<Runtime.InteropServices.DllImport("user32.dll")>
Private Function ShowWindow(ByVal hWnd As IntPtr, ByVal nCmdShow As Integer) As IntPtr
End Function
Public Sub TakeScreenshot()
Dim thread As New Threading.Thread(AddressOf TakeScreenShotThread)
thread.Start()
End Sub
Public Function TakeScreenShotThread() As Integer
Dim proc As Process = Process.GetCurrentProcess
Call SetForegroundWindow(proc.MainWindowHandle)
Call ShowWindow(proc.MainWindowHandle, 5)
'GIVE IT TIME TO DISPLAY THE APP AND ACTIVATE WINDOW
Dim t = Threading.Tasks.Task.Run(Async Function()
Await Threading.Tasks.Task.Delay(TimeSpan.FromMilliseconds(200))
Return 1
End Function)
t.Wait()
'SAVE SCREENSHOT IMAGE CODE HERE
End Function
1 उत्तर
दुर्भाग्य से (या यदि कोई उपयोगकर्ता के दृष्टिकोण से सौभाग्य से सोचता है) SetForegroundWindow
बिना शर्त "इस विंडो को सबसे महत्वपूर्ण/सक्रिय बनाएं" कमांड नहीं है।
इसमें प्रतिबंधोंका एक सेट है। ए>:
सिस्टम प्रतिबंधित करता है कि कौन सी प्रक्रियाएं अग्रभूमि विंडो सेट कर सकती हैं। एक प्रक्रिया अग्रभूमि विंडो को तभी सेट कर सकती है जब निम्न में से कोई एक स्थिति सत्य हो:
प्रक्रिया अग्रभूमि प्रक्रिया है।
प्रक्रिया अग्रभूमि प्रक्रिया द्वारा शुरू की गई थी।
प्रक्रिया को अंतिम इनपुट ईवेंट प्राप्त हुआ।
कोई अग्रभूमि प्रक्रिया नहीं है।
प्रक्रिया को डीबग किया जा रहा है।
अग्रभूमि प्रक्रिया कोई आधुनिक अनुप्रयोग या प्रारंभ स्क्रीन नहीं है।
अग्रभूमि लॉक नहीं है (देखें LockSetForegroundWindow)।
अग्रभूमि लॉक टाइम-आउट समाप्त हो गया है (SPI_GETFOREGROUNDLOCKTIMEOUT SystemParametersInfo में देखें)।
कोई मेनू सक्रिय नहीं है।
इसलिए जबकि सामान्य परिस्थितियों में इस प्रतिबंध को दूर करने के लिए कुछ अनुशंसित तरीके नहीं हैं, जब तक कि उनमें से कोई एक शर्त सत्य न हो, SetForegroundWindow
काम नहीं करेगा।
पुनश्च: इसके अलावा, पढ़ने की सिफारिश की - https://devblogs.microsoft.com/ Oldnewthing/20090220-00/?p=19083
PS1: हालांकि यह प्रतिबंध शायद यही कारण है कि मूल समाधान विफल हो जाता है, मैं यह भी बताना चाहूंगा कि एक मौका है कि proc.MainWindowHandle
IntPtr.Zero हो सकता है या एक पुराना हैंडल हो सकता है (कुछ शुरुआती विंडो से या आदि) और यह कि आप चेक मान लौटाएं "nofollow noreferrer">जिसे WIN API फ़ंक्शन कहा जाता है, दोनों बहुत महत्वपूर्ण हैं और वास्तव में समस्या के निवारण में सहायता कर सकते हैं...
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
c#
C # (उच्चारण "तेज देखें") Microsoft द्वारा विकसित एक उच्च स्तरीय, सांख्यिकीय रूप से टाइप किया हुआ, बहु-प्रतिमान प्रोग्रामिंग भाषा है। C # कोड आमतौर पर Microsoft के .NET परिवार के टूल और रन-टाइम को लक्षित करता है, जिसमें .NET फ्रेमवर्क, .NET कोर और Xamarin अन्य शामिल हैं। C # या C # के औपचारिक विनिर्देश में लिखे गए कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें।
ShowWindow
, फिरSetForegroundWindow
पर कॉल करने की कोशिश करें। यह एक अलग परिणाम दे सकता है।Show
फ़ंक्शन औरTopMost
फॉर्म की संपत्ति का उपयोग करने का भी प्रयास कर सकते हैं।