2016-08-11 11 views
8

के अंदर tabtip.exe को कैसे एम्बेड करूं मैं एक wpf विंडो या उपयोगकर्ता नियंत्रण में ओस्क एम्बेड करने की कोशिश कर रहा हूं और मुझे नीचे दिया गया कोड मिला है और यह नोटपैड के लिए काम कर रहा है लेकिन tabtip.exe के लिए, यह कह रहा है कि इसमें ग्राफिकल इंटरफ़ेस नहीं है ??मैं विंडोज

WaitForInputIdle विफल रहा। ऐसा इसलिए हो सकता है क्योंकि प्रक्रिया में ग्राफिकल इंटरफ़ेस नहीं है।

मैं दे यह waitForInputIdle विधि बुलाने की थोड़ी देर के बजाय के लिए सोने की कोशिश की, लेकिन यह एक और अपवाद फेंकता है:

प्रक्रिया से बाहर निकल गया है, इसलिए मांगी गई जानकारी उपलब्ध नहीं है।

लेकिन मेरे कार्य प्रबंधक में, मैं अभी भी TabTip.exe चल रहा हूं।

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private System.Windows.Forms.Panel _panel; 
     private Process _process; 

     public MainWindow() 
     { 
      InitializeComponent(); 
      _panel = new System.Windows.Forms.Panel(); 
      windowsFormsHost1.Child = _panel; 
     } 

     [DllImport("user32.dll")] 
     private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); 

     [DllImport("user32.dll", SetLastError = true)] 
     private static extern int GetWindowLong(IntPtr hWnd, int nIndex); 

     [DllImport("user32")] 
     private static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent); 

     [DllImport("user32")] 
     private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags); 

     private const int SWP_NOZORDER = 0x0004; 
     private const int SWP_NOACTIVATE = 0x0010; 
     private const int GWL_STYLE = -16; 
     private const int WS_CAPTION = 0x00C00000; 
     private const int WS_THICKFRAME = 0x00040000; 


     protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
     { 
      base.OnClosing(e); 
      if (_process != null) 
      { 
       _process.Refresh(); 
       _process.Close(); 
      } 
     } 

     private void ResizeEmbeddedApp() 
     { 
      if (_process == null) 
       return; 

      SetWindowPos(_process.MainWindowHandle, IntPtr.Zero, 0, 0, (int)_panel.ClientSize.Width, (int)_panel.ClientSize.Height, SWP_NOZORDER | SWP_NOACTIVATE); 
     } 

     protected override Size MeasureOverride(Size availableSize) 
     { 
      Size size = base.MeasureOverride(availableSize); 
      ResizeEmbeddedApp(); 
      return size; 
     } 

     private void button1_Click_1(object sender, RoutedEventArgs e) 
     { 
      button1.Visibility = Visibility.Hidden; 
      ProcessStartInfo psi = new ProcessStartInfo("C:\\Program Files\\Common Files\\microsoft shared\\ink\\TabTip.exe"); 
      _process = Process.Start(psi); 

      Thread.Sleep(500); 
      //_process.WaitForInputIdle(); 

      SetParent(_process.MainWindowHandle, _panel.Handle); 

      // remove control box 
      int style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE); 
      style = style & ~WS_CAPTION & ~WS_THICKFRAME; 
      SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style); 

      // resize embedded application & refresh 
      ResizeEmbeddedApp(); 
     } 

    } 
} 

संपादित करें: नवीनीकरण की टिप्पणी से प्रेरित होकर, मैं नीचे के रूप में खिड़की ptr और इस्तेमाल जासूसी ++ प्राप्त करने के लिए की पुष्टि है कि पता है कि FindWindow देता है सही खिड़की की ओर इशारा करते है की कोशिश की है, लेकिन यह अभी भी चलती नहीं है:

IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null); 


int style = GetWindowLong(KeyboardWnd, GWL_STYLE); 
style = style & ~WS_CAPTION & ~WS_THICKFRAME; 
SetWindowLong(KeyboardWnd, GWL_STYLE, style); 
SetWindowPos(KeyboardWnd, IntPtr.Zero, 0, 0, (int)_panel.ClientSize.Width, (int)_panel.ClientSize.Height, SWP_NOZORDER | SWP_NOACTIVATE); 

संपादित करें 2: मेरा पहला विचार यह है कि टैब टिप आकार नहीं बदला जा सकता था, लेकिन फिर मैं एक व्यवहार देखा है जब मैं दो अलग अलग स्क्रीन पर खिड़की ले जाने की कोशिश यह स्क्रीन के आकार के आकार बदल देंगे इसलिए मुझे यकीन है कि आकार बदलने का एक तरीका होना चाहिए, इसलिए मैंने जासूसी ++ (x64) को जांचने के लिए शुरू किया:

window log

संपादित करें 3: user32 एपीआई और कोई प्रगति के साथ abit संवारता के बाद, मैं एक्स और tabtip के y स्थिति के लिए स्कैन और इसे बदलने के लिए एक स्मृति स्कैनर का उपयोग करने की कोशिश की है, तथापि, यह एक रीपेंट तक ताज़ा नहीं है ट्रिगर किया गया है, मैं उस पथ को नीचे जाने की व्यवहार्यता पर सोच रहा हूं।

+1

मुझे लगता है कि आपके द्वारा शुरू किया गया इंस्टेंस तुरंत बंद हो गया है। [इन उत्तरों] (http://stackoverflow.com/questions/17090325/show-hiding-the-windows-8-on- स्क्रीन-keyboard-from-wpf) सुझाव है कि आपको एक विंडो की खोज करने की आवश्यकता है, जो आवश्यक नहीं है आपके द्वारा शुरू की गई प्रक्रिया उदाहरण की मुख्य विंडो। – rene

+0

यह आपकी मदद कर सकता है http://geekswithblogs.net/TechTwaddle/archive/2009/10/16/how-to-embed-an-exe-inside-another-exe-as-a.aspx – Mangrio

+0

@QadeerMangrio मैं हूँ एक और विंडो के अंदर ग्राफिक रूप से टैबटिप एम्बेड करना चाहते हैं, जो मैं समझता हूं, ब्लॉग स्मृति के संदर्भ में एम्बेड करने के तरीके के बारे में बात कर रहा है। –

उत्तर

1

क्या आप एसटीए थ्रेड में अपना हैंडल कोड चलाने की कोशिश कर सकते हैं? मुझे देशी विंडो के साथ एक ही समस्या थी, जिसे मैंने एसटीए थ्रेड का उपयोग करके हल किया था।

var thread = new Thread(() => { 
      // Your code here 
}); 
thread.TrySetApartmentState(ApartmentState.STA); 
thread.Start(); 
+0

मुझे यकीन नहीं है कि इससे कोई फर्क पड़ेगा लेकिन मैंने इसे आजमाया, इससे मदद नहीं मिली। –

संबंधित मुद्दे