NW.JS

2015-09-25 16 views
12

'daki program değiştiriciden pencereyi gizle NW.JS (node-webkit) ile masaüstü uygulaması yazıyorum. Benim uygulamada kullanıcı çok sayıda pencere açabilir ve onları program değiştiriciden (alt + sekme) ve görev çubuğundan saklamak istiyorum. Pencereyi taksbardan gizleme seçeneği buldum, ancak program değiştiriciden gizlemenin bir yolunu bulamıyorum. Bu mümkün mü? Ya da en azından tüm pencereleri tek olarak gruplamak mümkün mü (Windows'ta Yapışkan Notlar'da olduğu gibi)?NW.JS

cevap

0

NW.JS'yi hiç kullanmadım, bu nedenle bu tamamen yanlış olabilir, ancak NM.JS için bir Native UI modülü var gibi görünüyor. Bu modülü kullanarak yerel pencereler oluşturabileceğinizi ve onlara bir WS_EX_TOOLWINDOW stili verebildiğinizi hayal ediyorum. Bu cevaba bakınız: Best way to hide a window from the Alt-Tab program switcher. Yalnızca Windows'u hedefliyorsanız, bildirimlerin en iyi yolu budur. Başka bir düşünmek düşünmek, IFRAMES kullanarak uygulamanızı oluşturmaktır, böylece tek bir yerel pencere vardır. Sonra hangi IFRAMES'in gösterildiğine karar vermek için javascript ve kendi arayüzlerinizi kullanabilirsiniz.

1

Bu özellik muhtemelen bir noktada bulunacaktır, ancak sürüm 0.12.3'den itibaren node-webkit, araç türü pencereleri uygulamak için herhangi bir arabirim sağlamaz, bu nedenle javascript ile veya projenin paketini kullanarak bunu gerçekleştirmenin bir yolu yoktur .json dosyası. Burada iki seçenek düşünebilirim.

1. Düğüm-webkit'i kendiniz oluşturun. The guide oldukça düz ileri ve kapsamlı.

#if defined(OS_WIN) 
    HWND hwnd = views::HWNDForWidget(window_->GetTopLevelWidget()); 
    int current_style = ::GetWindowLong(hwnd, GWL_STYLE); 
    ::SetWindowLong(hwnd, GWL_STYLE, current_style | WS_CAPTION); //This is the importante line 
#endif 

için: Sen, native_aurora_aura.cc içinde NativeWindowAura yapıcısı değiştirmek için özellikle bu biraz gerekir

bu tüm yeni pencereler aracı varsayılan neden olacaktır basit bir çözüm olduğunu
::SetWindowLong(hwnd, GWL_STYLE, current_style | WS_CAPTION | WS_EX_TOOLWINDOW); 

Bildirimi Pencereleri değiştirirken stil ve görünmez. Bu özelliğin manifest dosyasına veya window API sürümüne sunulması, birkaç dosyada değişiklik yapılmasını gerektirir.

2. Paketlenmiş projenizi (veya proje klasörünüzü) yükleyen bir başlangıç ​​uygulamasını yazıp dağıtın, pencereleri sürekli olarak belirli bir başlık ile arar ve pencere stilini ayarlar. İşte C# konsol uygulaması kullanarak bir örnek, ama bunun için C++ veya herhangi NET dil kullanmak da kullanabilirsiniz:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Runtime.InteropServices; 
using System.Timers; 
using System.Diagnostics; 

namespace nw 
{ 
    class Program 
    { 
     const int GWL_EXSTYLE  = -0x14; 
     const int WS_EX_APPWINDOW = 0x40000; 
     const int WS_EX_TOOLWINDOW = 0x80; 
     const int WS_EX_COMPOSITED = 0x02000000; 

     [DllImport("user32", CharSet = CharSet.Auto)] 
     static extern int GetWindowLong(IntPtr hwnd, int index); 

     [DllImport("User32.Dll")] 
     static extern int SetWindowLong(IntPtr hwnd, int index, int newLong); 

     [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
     static extern int GetWindowText(IntPtr hWnd, StringBuilder strText, int maxCount); 

     [DllImport("user32.dll", CharSet = CharSet.Unicode)] 
     static extern int GetWindowTextLength(IntPtr hWnd); 

     [DllImport("user32.dll")] 
     static extern bool EnumWindows(EnumWindowsProc enumProc, IntPtr lParam); 

     [DllImport("user32.dll")] 
     static extern IntPtr SetWindowText(IntPtr HWND, string Text); 

     delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); 


     //------------------------------------------------------------------ 
     static void Main(string[] args) 
     { 
     // Test an unpackaged app like: 
     // Process.Start(<path\to\nw.exe>, <path\to\project-folder>); 

     Process.Start("packaged-nw-app.js"); 

     Timer timer = new Timer() { Interval = 100, Enabled = true }; 
     timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

     Console.ReadLine(); 
     } 


     //------------------------------------------------------------------ 
     static void OnTimedEvent(object source, ElapsedEventArgs e) 
     { 
     // Find our target windows (change "nw-tool-window" to your window title) 
     IEnumerable<IntPtr> windows = FindWindowsWithText("nw-tool-window"); 

     foreach (var window in windows) 
     { 
      // Apply WS_EX_TOOLWINDOW to the current style 
      SetWindowLong(window, GWL_EXSTYLE, (GetWindowLong(window, GWL_EXSTYLE) | WS_EX_TOOLWINDOW) & ~WS_EX_APPWINDOW); 
      // Change title to flag as changed 
      SetWindowText(window, "nw-tool-window-hidden"); 
     } 
     } 


     //------------------------------------------------------------------ 
     static string GetWindowText(IntPtr hwnd) 
     { 
     int size = GetWindowTextLength(hwnd); 

     if (size > 0) 
     { 
      var builder = new StringBuilder(size + 1); 
      GetWindowText(hwnd, builder, builder.Capacity); 
      return builder.ToString(); 
     } 

     return String.Empty; 
     } 


     //------------------------------------------------------------------ 
     static IEnumerable<IntPtr> FindWindows(EnumWindowsProc filter) 
     { 
     IntPtr found = IntPtr.Zero; 
     List<IntPtr> windows = new List<IntPtr>(); 

     EnumWindows(delegate(IntPtr wnd, IntPtr param) 
     { 
      if (filter(wnd, param)) 
      { 
       windows.Add(wnd); 
      } 

      return true; 
     }, IntPtr.Zero); 

     return windows; 
     } 


     //------------------------------------------------------------ 
     static IEnumerable<IntPtr> FindWindowsWithText(string titleText) 
     { 
     return FindWindows(delegate(IntPtr wnd, IntPtr param) 
     { 
      return GetWindowText(wnd).Contains(titleText); 
     }); 
     } 
    } 
} 

kod başlık here den alıyordu bulmak için. Sadece ana pencerenizle ilgileniyorsanız, yukarıdaki kodun çoğundan kurtulabilir ve sadece FindWindow ve SetWindowLong kullanarak uzaklaşabilirsiniz. Muhtemelen konsol veya pencereyi de gizlemelisiniz (bunu Forms veya WPF ile yapıyorsanız), bunu SO üzerinde nasıl yapacağınıza dair yeterli bilgi var.

İkinci yaklaşım biraz da olsa, birincisi ile gitmek istiyorum. Ve belki de sabit kodlanmış yerine düzgün bir şekilde yerine getirin ve bir çekme talebi açın :)

+1

Teşekkür ederim, bu onu uygulamak için bir yol gibi görünüyor. Bugün denemek için zaman bulabilir miyim göreceğim. Eğer iyi bir çözüm bulursam, bu özellik onların API'ları sayesinde gerçekten çok iyi olacağından, bir çekme isteği yapacağım. – thebreiflabb