2008-12-24 28 views
2

我們有一個應用程序使用雙顯示器設置 - 用戶A將與顯示器1一起使用,用戶B將與顯示器2同時使用。顯示器2是一個觸摸屏設備。如何解決雙監視器應用程序的焦點問題?

現在,問題是,當用戶A在他的屏幕上鍵入內容時,如果用戶B試圖做某件事,用戶A最終將失去焦點從他的窗口,這是災難性的。

什麼可能是一個很好的解決方案,以保持焦點在監視器1的窗口,即使用戶B做了什麼與監視器2?

回答

5

很可能與一些苦勞。在你顯示在觸摸屏上的形式此代碼粘貼:

protected override CreateParams CreateParams { 
    get { 
    const int WS_EX_NOACTIVATE = 0x08000000; 
    CreateParams param = base.CreateParams; 
    param.ExStyle |= WS_EX_NOACTIVATE; 
    return param; 
    } 
} 

這可以確保形式將不會從主要形式偷焦點。使它看起來像這樣:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
     Thread t = new Thread(SecondMonitor); 
     t.IsBackground = true; 
     t.SetApartmentState(ApartmentState.STA); 
     t.Start(); 
    } 
    private void SecondMonitor() { 
     Form2 f2 = new Form2(); 
     f2.StartPosition = FormStartPosition.Manual; 
     f2.Left = 800; // Use Screen class here... 
     f2.ShowDialog(); 
    } 
4

對我來說,這聽起來像你可能想要2臺PC ......或者也許在PC上託管一臺虛擬機,然後通過USB視頻「卡」讓虛擬機訪問第二臺顯示器(不太合適) 。幾乎現代的虛擬機允許USB傳輸。大多數時候,多頭顯示器既可用於爲單個用戶提供大量屏幕空間,也可用作僅顯示設備(例如,在大型基礎架構設置中顯示實時網絡/服務器統計信息)。

+0

所以,你想說,當用戶使用另一個窗口時,「沒有」保持對一個窗口焦點的方式?謝謝 – amazedsaint 2008-12-24 10:56:49

+0

我說這會很難而且不簡單;你可能需要專業知識和可能的特殊驅動。除此之外,我不知道。 – 2008-12-24 11:02:37

+0

謝謝。但託管虛擬機是一個重量級的解決方案。 – amazedsaint 2008-12-24 13:25:37

1

我不能看到讓兩個用戶同時訪問相同桌面環境的方法,而不會遇到焦點問題。如果你考慮一下,允許兩個應用程序(或者在這種情況下,一個具有兩個用戶「區域」的應用程序總是會有問題,因爲應用程序需要嘗試跟蹤哪個輸入設備最近在哪個區域工作屏幕。

可能能夠將功能添加到過濾每個設備輸入和每個不同的輸入發送到一組獨立的控制,但我想這將需要一些驅動級的工作。

1

我從來沒有在觸摸屏上工作,但我傾向於認爲它們像鼠標一樣工作,所以如果這是真的,我認爲你可以使用Windows鉤子來捕獲事件,如果事件來自鍵盤(我認爲它是單身),把它引向你的冷杉st窗口。如果事件來自鼠標,請檢查其座標(如果有的話可能是設備ID,我不知道)。如果它在你的第一個窗口內,直接輸入它。如果它在第二個屏幕中,則直接輸入到第二個窗口。

如果屏幕不像鼠標,我想你會找到另一種方法來爲它掛鉤。

我不知道這是否可行。這只是一個概念性的想法。

編輯:當然,您需要確定哪個應用程序應該在第一個屏幕上接收消息。我想Z-順序可以幫助,除非用戶打開一些頂部的應用程序。跟蹤OnFocus消息(或類似的東西)可能會更好,以跟蹤哪個應用程序獲得焦點(不包括您的其他應用程序)。

(註釋說明採用這種方法的任何deficencies都非常歡迎!)

0

能不假嗎?有一個跨越兩個監視器的窗口,並充當您正在使用的窗口的容器?

相關問題