2016-09-09 13 views
6

से विंडोज़ एप्लिकेशन पर फोकस सेट करना मेरे पास एक नोडजेएस एप्लीकेशन है जो विंडोज़ पर चल रहा है जिसे उपयोगकर्ता को एक निश्चित कार्रवाई करते समय एक चल रहे विंडोज एप्लिकेशन पर फोकस प्रदर्शित करने और स्विच करने की आवश्यकता होती है। मैं विंडोज एपीआई कॉल करने के लिए नोड-एफएफआई पैकेज का उपयोग कर रहा हूं लेकिन इसे लगातार ध्यान केंद्रित करने में सक्षम नहीं हूं। यहां वह कोड है जिसका मैं उपयोग कर रहा हूं। यह सफलतापूर्वक एक चल कैलक्यूलेटर एप्लिकेशन के HWND हो जाता है, लेकिन फिर कि HWND के फोकस स्विच करने के लिए कोशिश करता है और यह केवल कभी कभी काम करता है:नोड-जेएस

var ffi = require('ffi'); 
    var intPtr = ref.refType('long'); 
    var user32 = new ffi.Library('user32', { 
     'FindWindowA': ['long', [ 'string', 'string']], 
     'SetForegroundWindow': ['bool', ['long']], 
     'BringWindowToTop': ['bool', ['long']], 
    }); 

    var winToSetOnTop = user32.FindWindowA(null,"calculator") 
    var res = user32.ShowWindow(winToSetOnTop, 9); 
    res = user32.SetForegroundWindow(winToSetOnTop); 
    res = user32.BringWindowToTop(winToSetOnTop); 

आदेशों का यह मिश्रण सबसे उनके जो मेरे द्वारा की कोशिश की है की लगातार काम करने लगता है, लेकिन यह हर समय काम नहीं करता है। यदि खिड़की मैं फोकस स्विच करना चाहता हूं तो इसे कम से कम शीर्ष पर पॉप किया जाएगा। यदि खिड़की को कम नहीं किया गया है, लेकिन सिर्फ एक और विंडो के पीछे, यह केवल intermittently दिखाया जाएगा। मैं निश्चित रूप से आदेश के शीर्ष पर जाने के लिए चलने वाले विंडोज एप्लिकेशन को प्राप्त करने के लिए कैसे सुनिश्चित नहीं हूं, भले ही यह वर्तमान में कम हो।

+0

आप दोनों कहते हैं कि यह हमेशा कम से कम खिड़कियों के लिए काम करता है, साथ ही यह लगातार काम नहीं करता है। कोनसा वाला सत्य है? – IInspectable

+0

आप त्रुटियों की जांच नहीं करते हैं। SetForegroundWindow विशेष रूप से शर्तों की सूची के लिए दस्तावेज़ पढ़ें। –

+0

@IInspectable यह हमेशा शीर्ष पर एक न्यूनतम विंडो लाएगा। यदि खिड़की को कम नहीं किया गया है, लेकिन केवल एक और खिड़की के पीछे है, तो यह केवल इसे शीर्ष पर ले जाएगा। – KeithTheBiped

उत्तर

7

मैंने निम्नलिखित समाधान तैयार किया है जो सभी परिस्थितियों में शीर्ष पर एक विंडो लाने के लिए अच्छी तरह से काम करता है। सबसे पहले यह कैलकुलेटर एप्लिकेशन के चल रहे उदाहरण के लिए विंडो हैंडल प्राप्त करेगा, फिर यह इसे सबसे ऊपर लाएगा और इसे फोकस करेगा।

var user32 = new ffi.Library('user32', { 
    'GetTopWindow': ['long', ['long']], 
    'FindWindowA': ['long', ['string', 'string']], 
    'SetActiveWindow': ['long', ['long']], 
    'SetForegroundWindow': ['bool', ['long']], 
    'BringWindowToTop': ['bool', ['long']], 
    'ShowWindow': ['bool', ['long', 'int']], 
    'SwitchToThisWindow': ['void', ['long', 'bool']], 
    'GetForegroundWindow': ['long', []], 
    'AttachThreadInput': ['bool', ['int', 'long', 'bool']], 
    'GetWindowThreadProcessId': ['int', ['long', 'int']], 
    'SetWindowPos': ['bool', ['long', 'long', 'int', 'int', 'int', 'int', 'uint']], 
    'SetFocus': ['long', ['long']] 
}); 

var kernel32 = new ffi.Library('Kernel32.dll', { 
    'GetCurrentThreadId': ['int', []] 
}); 

var winToSetOnTop = user32.FindWindowA(null, "calculator") 
var foregroundHWnd = user32.GetForegroundWindow() 
var currentThreadId = kernel32.GetCurrentThreadId() 
var windowThreadProcessId = user32.GetWindowThreadProcessId(foregroundHWnd, null) 
var showWindow = user32.ShowWindow(winToSetOnTop, 9) 
var setWindowPos1 = user32.SetWindowPos(winToSetOnTop, -1, 0, 0, 0, 0, 3) 
var setWindowPos2 = user32.SetWindowPos(winToSetOnTop, -2, 0, 0, 0, 0, 3) 
var setForegroundWindow = user32.SetForegroundWindow(winToSetOnTop) 
var attachThreadInput = user32.AttachThreadInput(windowThreadProcessId, currentThreadId, 0) 
var setFocus = user32.SetFocus(winToSetOnTop) 
var setActiveWindow = user32.SetActiveWindow(winToSetOnTop) 
+0

उपयोगकर्ता 32 एपीआई के बारे में मुझे और कहां मिल सकता है? –

+0

@PauloHenrique विकी प्रविष्टि https://en.wikipedia.org/wiki/Windows_USER उपयोगकर्ता32.dll के बारे में उच्च स्तर की जानकारी प्रदान करता है। एक गहरे गोता लगाने के लिए आप विंडोज एपीआई के तहत एमएसडीएन देख सकते हैं। मेरे समाधान में उपयोग किए जाने वाले अधिकांश कार्यों के लिए दस्तावेज़ीकरण "विंडोज़" खंड में पाया जा सकता है: https://msdn.microsoft.com/en-us/library/windows/desktop/ff468919(v=vs.85).aspx । अन्यथा, WINAPI प्रोग्रामिंग एक गहरा अंधेरा छेद है और अधिक जानकारी के लिए मुझे कुछ प्रारंभिक मार्गदर्शिका मिलेंगी, जिनमें से कई विंडोज़ ओएस अवधारणाओं, डेटा संरचनाओं आदि का अवलोकन पाने के लिए – KeithTheBiped

+0

प्रदान करने का मूल्य 'FindWindowA' को प्रक्रिया का TITLE है। – Luke