2010-03-11 7 views
10

Tôi muốn viết bàn phím ảo, như bàn phím ảo trên màn hình cho màn hình cảm ứng. Nhưng tôi đang gặp sự cố với bàn phím ảo của mình đánh cắp tiêu điểm từ ứng dụng đang được sử dụng. Các cửa sổ trên bàn phím màn hình mantains tập trung vào các ứng dụng hiện tại ngay cả khi người dùng nhấp vào nó. Có cách nào để làm tương tự với các hình thức cửa sổ trong C#?Tạo biểu mẫu không thể lấy nét trong C#

Điều duy nhất tôi có thể làm bây giờ là gửi sự kiện bàn phím đến một ứng dụng đặc biệt, như notepad trong đoạn mã sau. Nếu tôi có thể làm cho các hình thức không tập trung, tôi có thể nhận được cửa sổ tập trung hiện tại với GetForegroundWindow.

[DllImport("USER32.DLL", CharSet = CharSet.Unicode)] 
public static extern IntPtr FindWindow(string lpClassName,string lpWindowName); 


[DllImport("USER32.DLL")] 
public static extern bool SetForegroundWindow(IntPtr hWnd); 

private void button1_Click(object sender, EventArgs e) 
{ 
    IntPtr calculatorHandle = FindWindow("notepad", null); 
    SetForegroundWindow(calculatorHandle); 
    SendKeys.SendWait("111"); 
} 

Có cách nào có thể thực hiện được không? Bất kỳ đề xuất nào về cách thức tốt hơn để có biểu mẫu gửi các sự kiện bàn phím đến ứng dụng đang được sử dụng?

Cảm ơn !!

Trả lời

8

Thay vì cố gắng đặt lại cửa sổ hiện hoạt sau khi bạn đã nhấp vào cửa sổ, tôi muốn tránh cửa sổ của bạn không nhận được tiêu điểm/được kích hoạt.

Hãy xem this article. Cuối cùng, tác giả giải thích ngắn gọn về cách thực hiện điều này:

Làm cách nào để ngăn cửa sổ của tôi kích hoạt và tập trung khi được hiển thị?

Trong Windows Forms 2.0 có một thuộc tính mới được gọi là ShowWithoutActivation - bạn sẽ cần ghi đè lên Biểu mẫu. Trong các ứng dụng gốc, bạn có thể sử dụng SetWindowPos với cờ SWP_NOACTIVATE hoặc ShowWindow với cờ SW_SHOWNA.

Hơn nữa, trong this article ông cung cấp một ví dụ mã cho Windows Forms:

Nếu bạn muốn có một đầy đủ vào mẫu, bây giờ bạn có thể ghi đè lên một tính chất gọi ShowWithoutActivation:

public class NoActivateForm : Form { 
    protected override bool ShowWithoutActivation { 
     get { 
      return true; 
     } 
    } 
}

Hãy nhớ rằng điều này không "ngăn chặn" kích hoạt mọi lúc - bạn có thể vẫn kích hoạt bằng cách gọi số Activate(), Focus() phương pháp…. Nếu bạn muốn ngăn các nhấp chuột trên khu vực khách hàng kích hoạt cửa sổ , bạn có thể xử lý thông báo WM_MOUSEACTIVATE.

private const int WM_MOUSEACTIVATE = 0x0021, MA_NOACTIVATE = 0x0003; 

protected override void WndProc(ref Message m) { 
    if (m.Msg == WM_MOUSEACTIVATE) { 
     m.Result = (IntPtr)MA_NOACTIVATE; 
     return; 
    } 
    base.WndProc(ref m); 
}
+0

+1 Ý tưởng tốt đẹp/con trỏ. –

+0

Cảm ơn! Nửa chừng đã xong! Giải pháp bài viết đó ngăn cản biểu mẫu của tôi lấy tiêu điểm, nhưng không ngăn ứng dụng kia mất tập trung. Tức là, khi tôi nhấp vào ứng dụng của mình, tôi sẽ gặp phải tình huống không có ứng dụng nào tập trung. – Jandex

+0

Trong trường hợp các liên kết trở nên không hợp lệ, câu trả lời của bạn về cơ bản không chứa thông tin.Vui lòng tóm tắt các tài nguyên ngoài trang web, để câu trả lời của bạn tiếp tục có giá trị, ngay cả khi các tài nguyên ngoài trang web chết. – IInspectable

9

Đã giải quyết!

Tôi đã thử các giải pháp từ gehho, nhưng tôi cũng cần phải ghi đè lên các phương pháp CreateParams:

private const int WS_EX_NOACTIVATE = 0x08000000; 
protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams createParams = base.CreateParams; 
      createParams.ExStyle |= WS_EX_NOACTIVATE; 
      return createParams; 
     } 
    } 
+3

Bạn không nên kỹ thuật * thêm * vào 'createParams.ExStyle', thay vì thay thế hoàn toàn? (ví dụ: 'createParams.ExStyle | = WS_EX_NOA [...];') – Jesse

+0

Tôi đã chỉnh sửa mã trong câu trả lời có hiệu lực thay đổi –

+0

@DavidHeffernan sao cho bạn chỉnh sửa nó để thực hiện thay đổi do Jesse đề xuất? – barlop