2012-08-16 37 views
7

Tôi đang viết một ứng dụng yêu cầu hai màn hình: một cho bảng điều khiển, màn hình kia cho đầu ra. Những gì tôi có là: nếu chỉ có một màn hình, ứng dụng sẽ hiển thị cả hai biểu mẫu trên nó nhưng nếu có hai, biểu mẫu đầu ra sẽ chuyển sang biểu mẫu kia. Vấn đề là điều này chỉ xảy ra khi ứng dụng được bắt đầu. Nói cách khác, nếu ứng dụng đã chạy trước khi màn hình thứ hai được kết nối, không có gì xảy ra trừ khi người dùng gửi đầu ra đến màn hình mới theo cách thủ công (giả sử họ biết cách thực hiện). Điều tôi muốn là khi màn hình mới được kết nối, biểu mẫu đầu ra sẽ tự động được gửi đến ngay cả khi ứng dụng đang chạy. Tôi nghĩ rằng nó đã làm với bỏ phiếu một cảng trong một chủ đề nhưng tôi không biết làm thế nào để làm điều đó. Bất cứ ai có thể giúp làm thế nào để làm điều đó? Nếu có một giải pháp tốt hơn, tôi sẽ sẵn sàng chào đón nó.Phát hiện khi màn hình mới được kết nối

(Tôi đã cung cấp một số phần của mã nhưng tôi đang nhập mã này từ điện thoại)

+0

Bạn có thể tạo một vòng bỏ phiếu để thường xuyên kiểm tra đối với một màn hình mới trong một nền công nhân chủ đề/nền. Ví dụ. đọc thuộc tính ['Screen.AllScreens'] (http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.allscreens.aspx) và thực hiện một số mã nếu nó trở thành'> 1' . –

+0

Đó là những gì tôi nghĩ nhưng tôi cần mã về cách thực hiện. Tôi có vấn đề với việc viết chủ đề. Bạn có thể giúp chứ? – afaolek

+1

Bạn có thể sử dụng lớp này: http://msdn.microsoft.com/en-us/library/system.windows.forms.screen(v=vs.100).aspx Và bạn có thể sử dụng BackgroundWorker: http: // msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.100).aspx – Davio

Trả lời

8

Lookie đây: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx

Có một ví dụ mà sẽ giúp bạn. Hãy thử một cái gì đó như thế này:

protected override void WndProc(ref Message m) 
    { 
     const uint WM_DISPLAYCHANGE = 0x007e; 

     // Listen for operating system messages. 
     switch (m.Msg) 
     { 
      case WM_DISPLAYCHANGE: 

       // The WParam value is the new bit depth 
       uint width = (uint)(m.LParam & 0xffff); 
       uint height = (uint)(m.LParam >> 16); 
       break;     
     } 
     base.WndProc(ref m); 
    } 
0

Bạn có thể bao gồm bộ hẹn giờ kiểm tra ví dụ: cứ 2 giây một lần nếu số màn hình nhiều hơn một lần. Mã có thể trông giống như sau:

timer_tick() 
{ 
    if(Screen.AllScreens.Length >= 2) 
    { 
     //run code to use the second screen 
    } 
} 

Thật dễ dàng để sử dụng cho người mới bắt đầu trong C#.

+0

Điều này là sai! Bạn không phải bao gồm bất kỳ bộ đếm thời gian nào! – sergiol

+0

Điều này không sai. Nó hoạt động.Bạn không cần phải bao gồm bất kỳ bộ đếm thời gian, đó là đúng, nhưng xin vui lòng cụ thể hơn, những gì một mã mà không có một bộ đếm thời gian sẽ trông loike – Paedow

+0

@ sergiol Nó tốt hơn như thế này? – ANeves

0

Bạn có thể sử dụng WndProcScreen.AllScreens.Length:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")] 
    protected override void WndProc(ref Message m) 
    { 
     if (Screen.AllScreens.Length > 1) //example 
     { 


     } 
     base.WndProc(ref m); 
    } 

Thông tin thêm:

Các vấn đề liên quan