2009-02-09 32 views
5

Có ai biết cách tạo cửa sổ 'luôn luôn ở dưới cùng' hoặc cửa sổ được ghim vào màn hình nền không? Nó sẽ nhận được tập trung và mouseclicks, nhưng nên ở dưới cùng của lệnh Z. Nó cũng sẽ là tuyệt vời nếu nó có thể ở lại trên máy tính để bàn ngay cả khi người dùng làm giảm thiểu tất cả hoặc hiển thị hoạt động máy tính để bàn.Cách đặt 'luôn luôn-dưới-dưới'-cửa sổ

Cả hai giải pháp delphi và C# (hoặc một phần giải pháp/gợi ý) sẽ là tuyệt vời.

+0

Nếu có thể bạn nên sử dụng cái gì khác nhưng Delphi, bởi vì sự tương tác giữa các cửa sổ ứng dụng ẩn và cửa sổ chính sẽ làm cho những thứ thậm chí phức tạp hơn. Hầu hết trong số này là công cụ riêng tư trong forms.pas, khó thay đổi. – mghie

+0

Không thể thực hiện khi Hiển thị màn hình nền được sử dụng. Nó có thể, tuy nhiên khi Minimize All được sử dụng - bằng cách thiết lập thuộc tính MinimizeBox thành false, bạn sẽ vô hiệu hóa việc giảm thiểu biểu mẫu. – configurator

+0

Nhân bản: http://stackoverflow.com/questions/365094/window-on-desktop –

Trả lời

12

Cảnh báo Bạn nên thực hiện điều này bằng cách gọi SetParent và đặt cửa sổ thành con của màn hình nền. Nếu bạn làm điều này, bạn gây Manager Win32 Window kết hợp hàng đợi đầu vào của Desktop để cửa sổ con của bạn, đây là một điều xấu -Raymond Chen explains why.

Ngoài ra, hãy nhớ rằng gọi SetWindowPos với HWND_BOTTOM là không đầy đủ. Bạn cần phải làm điều này bất cứ khi nào cửa sổ của bạn đang thay đổi zorder. Xử lý sự kiện WM_WINDOWPOSCHANGING, xem SWP_NOZORDER để biết thêm thông tin.

7

SetWindowPos có thể đặt cửa sổ AlwaysOnTop. Nhiều khả năng nó có thể cho kết quả ngược lại. Hãy thử một cái gì đó dọc theo những dòng:

[DllImport("user32.dll")] 
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, 
    int Y, int cx, int cy, uint uFlags); 


public const uint SWP_NOSIZE   = 0x0001; 
public const uint SWP_NOMOVE   = 0x0002; 
public const uint SWP_NOACTIVATE  = 0x0010; 
public const int HWND_BOTTOM = 1; 


SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE); 

Lưu ý:

  • đã không được thử nghiệm phương pháp này (để làm cửa sổ luôn luôn ở phía dưới)
  • Nếu điều đó xảy đến làm việc, thì rất có thể máy tính để bàn chương trình hoạt động sẽ ẩn cửa sổ. Vì vậy, có lẽ bạn nên đi sâu hơn vào API 'đẹp' này.

CHỈNH SỬA: Hoàn thành một số tìm kiếm dọc theo các dòng này để xác nhận xem nó có thực hiện thủ thuật hay không và tìm thấy điều gì đó thú vị - a duplicate.

+1

+1 cho liên kết đến câu hỏi SO khác, nó phải chứa mọi thứ để bắt đầu OP. – mghie

1

Đây là giải pháp cho cửa sổ ATL. Nếu bạn có thể đăng ký với C#, nó sẽ giúp bạn.


BEGIN_MSG_MAP(...) 
    ... 
    MESSAGE_HANDLER(WM_WINDOWPOSCHANGING, OnWindowPosChanging) 
    ... 
END_MSG_MAP() 

LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) 

{ 

    if (_bStayOnBottom) 
    { 
     auto pwpos = (WINDOWPOS*)lParam; 

     pwpos->hwndInsertAfter = HWND_BOTTOM; 

     pwpos->flags &= (~SWP_NOZORDER); 

    } 
    return 0; 
} 
+0

Công trình này tuyệt vời! Cảm ơn bạn! – Andy

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