2016-09-09 76 views
6

Windows'da çalışan ve kullanıcının belirli bir eylemi gerçekleştirdiğinde çalışan bir Windows uygulamasına geçmesi gereken bir NodeJS uygulamasına sahibim. Windows API çağrılarını yapmak için node-ffi paketini kullanıyorum ancak sürekli olarak odağı değiştiremedim. İşte kullanıyorum kod. Başarıyla çalışan bir Hesaplama app HWND alır, ama o HWND odağı geçmek için çalışır ve sadece bazen çalışır:Odağı Windows uygulamasına ayarlama Node-JS

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); 
komutların Bu kombinasyon en tutarlı ben denedim olanlar iş gibi görünüyor

ama her zaman işe yaramıyor. Odağı değiştirmek istediğim pencere en aza indirilirse, her zaman en üste gelecek. Pencere küçültülmemişse, ancak başka bir pencerenin arkasındaysa, yalnızca aralıklı olarak gösterilecektir. Şu anda küçültülmüş olsa bile, her zaman siparişin en üstüne geçmek için çalışan bir windows uygulaması almak için tutarlı bir şekilde emin değilim.

+0

Her ikisini de söylerseniz, her zaman, sürekli olarak çalışmadığı gibi, en aza indirilmiş pencereler için de çalışır. Hangisi doğru? – IInspectable

+0

Hataları kontrol etmiyorsunuz. SetForegroundWindow için dokümanları özellikle koşulların listesini okuyun. –

+0

@IInspectable Her zaman en aza indirgenmiş bir pencereyi en üste getirecektir. Bir pencere simge durumuna küçültülmez, ancak yalnızca başka bir pencerenin arkasındaysa, yalnızca aralıklı olarak üst kısma getirilir. – KeithTheBiped

cevap

7

Her koşulda iyi çalışan ve aşağıdaki pencereyi bir pencereye getirmek için aşağıdaki çözümü kullandım. Öncelikle, pencere tanıtıcısını Hesap Makinesi uygulamasının çalışan bir örneğine götürecek, sonra en üst seviyeye getirecek ve odaklanacaktır.

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

user32 api hakkında daha fazla bilgiyi nerede bulabilirim? –

+0

@PauloHenrique Wiki girişi https://en.wikipedia.org/wiki/Windows_USER, user32.dll hakkında biraz yüksek düzeyde bilgi verir. Daha derin bir dalış için MSDN'e Windows API altında bakabilirsiniz. Çözümümde kullanılan işlevlerin çoğunun belgelerini "Windows" bölümünde bulabilirsiniz: https://msdn.microsoft.com/en-us/library/windows/desktop/ff468919(v=vs.85).aspx . Aksi takdirde, WINAPI programlama derin bir karanlık deliktir ve daha fazla bilgi için, Windows işletim sistemi kavramlarının, veri yapılarının, vb. Bazılarına genel bir bakış sağlamak için çok fazla olan bir giriş kılavuzu bulabilirim. – KeithTheBiped

+0

Sağlama değeri FindWindowA için sürecin TITLE olduğunu. – Luke