Vì vậy, tôi đã tìm kiếm google và SO trước khi hỏi câu hỏi này. Về cơ bản tôi có một DLL có một hình thức biên dịch vào nó. Biểu mẫu sẽ được sử dụng để hiển thị thông tin cho màn hình. Cuối cùng nó sẽ không đồng bộ và hiển thị nhiều tùy biến trong dll. Bây giờ tôi chỉ muốn nó hiển thị đúng. Vấn đề mà tôi đang gặp phải là tôi sử dụng dll bằng cách tải nó trong một phiên Powershell. Vì vậy, khi tôi cố gắng để hiển thị các hình thức và làm cho nó đến đầu và tập trung, Nó không có vấn đề với hiển thị trên tất cả các ứng dụng khác, nhưng tôi không thể cho cuộc sống của tôi làm cho nó hiển thị trên cửa sổ Powershell . Đây là mã mà tôi hiện đang sử dụng để thử và hiển thị mã đó. Tôi chắc chắn rằng phần lớn của nó sẽ không được yêu cầu một khi tôi tìm ra nó, điều này chỉ đại diện cho tất cả những điều mà tôi tìm thấy thông qua google.C# Force Form Focus
CLass Blah
{
[DllImport("user32.dll", EntryPoint = "SystemParametersInfo")]
public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, uint pvParam, uint fWinIni);
[DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("User32.dll", EntryPoint = "ShowWindowAsync")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private const int WS_SHOWNORMAL = 1;
public void ShowMessage(string msg)
{
MessageForm msgFrm = new MessageForm();
msgFrm.lblMessage.Text = "FOO";
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.TopMost = true;
msgFrm.Activate();
SystemParametersInfo((uint)0x2001, 0, 0, 0x0002 | 0x0001);
ShowWindowAsync(msgFrm.Handle, WS_SHOWNORMAL);
SetForegroundWindow(msgFrm.Handle);
SystemParametersInfo((uint)0x2001, 200000, 200000, 0x0002 | 0x0001);
}
}
Như tôi nói chắc chắn rằng hầu hết điều đó là không cần thiết hoặc thậm chí không đúng, tôi chỉ muốn hiển thị những điều tôi đã thử. Ngoài ra, như tôi đã đề cập, tôi có kế hoạch để có điều này được hiển thị không đồng bộ tại một số điểm mà tôi nghi ngờ sẽ gió lên đòi hỏi một sợi riêng biệt. Sẽ tách các hình thức ra thành chủ đề riêng của nó làm cho nó dễ dàng hơn để làm cho nó để có được tập trung trong phiên Powershell?
@Joel, cảm ơn thông tin. Đây là những gì tôi đã cố gắng dựa trên đề xuất của bạn:
msgFrm.ShowDialog();
msgFrm.BringToFront();
msgFrm.Focus();
Application.DoEvents();
Hình thức vẫn đi lên dưới phiên Powershell. Tôi sẽ tiếp tục làm việc với luồng. Tôi đã sinh ra các chủ đề trước đây nhưng không bao giờ nơi mà các chủ đề cha mẹ cần thiết để nói chuyện với các chủ đề con, vì vậy chúng tôi sẽ xem nó như thế nào đi.
Thnks cho tất cả ý tưởng cho đến nay mọi người.
Ok, luồng này đã giải quyết được sự cố. @Quarrelsome, tôi đã thử cả hai. Cả hai (không phải cả hai cùng nhau) đều hoạt động. Tôi tò mò về điều gì là xấu về việc sử dụng luồng? Tôi không sử dụng Application.Run và tôi chưa có vấn đề gì. Tôi đang sử dụng một lớp hòa giải mà cả chuỗi gốc và chuỗi con có quyền truy cập. Trong đối tượng đó, tôi đang sử dụng ReaderWriterLock để khóa một thuộc tính đại diện cho thông báo mà tôi muốn hiển thị trên biểu mẫu mà chuỗi con tạo ra. Các phụ huynh khóa tài sản sau đó viết những gì sẽ được hiển thị. Các chủ đề con khóa tài sản và đọc những gì nó nên thay đổi nhãn trên biểu mẫu để. Đứa trẻ phải làm điều này trong một khoảng thời gian bỏ phiếu (tôi mặc định nó là 500ms) mà tôi không thực sự hạnh phúc, nhưng tôi không thể tìm thấy một sự kiện hướng dẫn để cho các chủ đề con biết rằng proerty đã thay đổi, vì vậy tôi ' m bị mắc kẹt với việc bỏ phiếu.
có thể bạn chỉ cần gọi Focus() trên một trong các điều khiển trong các hình thức? –
Cảm ơn bạn đã trả lời. @Chỉ, chỉ cần cố gắng tập trung() một điều khiển trên biểu mẫu vết thương với cùng kết quả mà tôi đã nhận được. @Dean, tôi nghĩ rằng để sử dụng phương pháp của bạn, tôi sẽ cần phải tách biểu mẫu ra thành chuỗi riêng của nó. Tôi đã lên kế hoạch để làm điều đó nyway tại một số điểm vì vậy tôi đoán tôi sẽ bắt đầu vào đó ngay bây giờ. – EBGreen