2012-07-16 39 views
15

Tôi đang tìm kiếm các lựa chọn thay thế cho phiên bản cũ User32.dll chuyển đổi sang một ứng dụng khác với FindWindow()SetForegroundWindow().FindWindow và SetForegroundWindow lựa chọn thay thế?

Tôi đã tìm một giải pháp thay thế đầu tiên với cách sử dụng Process.GetProcessesByName() nhưng tôi không thấy phương thức tương ứng để chuyển (đặt hoạt động/nền trước) sang ứng dụng đó.

Có cách nào để thực hiện điều đó mà không sử dụng cách với User32.dll không?

Cảm ơn sự giúp đỡ của bạn.

EDIT

tôi chấp nhận câu trả lời của @Sorceri mặc dù nó không phải là câu trả lời tôi đang tìm kiếm.

+2

Có gì sai khi sử dụng 'SetForegroundWindow'? Hệ điều hành Windows theo dõi các cửa sổ nền trước trong hệ thống con Win32, do đó, tuy nhiên bạn làm điều đó chỉ là sẽ được P/Invoking đến 'user32.dll' anyway. –

+0

@MichaelGraczyk: Hoặc ít nhất, chúng tôi giả định rằng an toàn ... :) –

+1

Trên Windows Desktop, tôi phải sử dụng 'user32.dll' trên Windows CE Tôi phải sử dụng' coredll.dll'. Vì vậy, bằng cách sử dụng một 'DLLImport' luôn luôn cho thấy rằng bạn thêm phụ thuộc tĩnh đó là sai. – fdomig

Trả lời

27

Trả lời: Không

Tuy nhiên, để giúp các wonderer tiếp theo tìm kiếm để tìm một cửa sổ và kích hoạt nó từ C# đây là những gì bạn phải làm:

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

void ActivateApp(string processName) 
{ 
    Process[] p = Process.GetProcessesByName(processName); 

    // Activate the first application we find with this name 
    if (p.Count() > 0) 
     SetForegroundWindow(p[0].MainWindowHandle); 
} 

Để mang lại notepad để phía trước, ví dụ, bạn sẽ gọi:

ActivateApp("notepad"); 

Như một mặt lưu ý - cho những người bạn của những người đang cố gắng để mang lại một wi ndow trong ứng dụng của bạn đến nền trước chỉ cần gọi Activate() method.

+0

Vì vậy, sau khi tôi sử dụng phương pháp này để đưa lên quá trình mong muốn, tôi có thể sử dụng khả thi SendKeys.SendWait ("{ENTER}"); không có khiếu nại, miễn là ứng dụng của tôi thực sự phản hồi các lần nhấn phím? – HanH1113

+0

Tài liệu trên SendWait gợi ý bạn có thể - cho chúng tôi biết nếu tài liệu hoạt động! – noelicus

+0

Tôi đã thử nó và điều kỳ lạ là nó hoạt động SOMETIMES, mà tôi thấy thực sự kỳ lạ đối với máy móc. Vấn đề là máy tính luôn làm những gì chúng tôi nói với họ, không nhất thiết là những gì chúng tôi muốn. Tôi có thể phải hỏi một câu hỏi hoàn toàn mới. – HanH1113

1

Bạn có thể sử dụng System.Diagnostics.Process Object cho tương đương FindWindow. Hiện tại không có tương đương với SetForegroundWindow. Bạn sẽ muốn sử dụng Pinvoke với SetForgroundWindow.

[DllImport("user32.dll")] 
static extern bool SetForegroundWindow(IntPtr hWnd); 
+1

Điều đó có nghĩa là tôi vẫn phải đối phó với user32.dll sau khi tất cả? Nó âm thanh bằng cách nào đó lạ rằng không có thay thế ... – fdomig

3

Bạn có thể sử dụng SetActiveWindow làm phương án thay thế cho SetForeGroundWindow. Tôi muốn nói rằng bạn nên đi qua tất cả các Windows Manipulation Api Functions và xem nếu có một cái gì đó bạn đang bỏ lỡ.

Ngoài ra, lưu ý rằng bạn có thể lấy tay cầm của đối tượng System.Diagnostics.Process qua thuộc tính Process.Handle.

2

Một thay thế cho SetForegroundWindow là VisualBasic của AppActivate

Gọi nó như thế này

Microsoft.VisualBasic.Interaction.AppActivate("WindowTitle") 

Chỉ vì nó là trong không gian tên VisualBasic không có nghĩa là bạn không thể sử dụng nó trong C#.

Tài liệu đầy đủ here