再明确一下,不要使用VCL体系,完全使用 windows api,不要用TForm类。给出完整的代码。
时间: 2024-02-15 07:04:41 浏览: 27
好的,下面是使用 Windows API 实现的完整代码,实现了您的要求:
```delphi
program DesktopApp;
{$APPTYPE CONSOLE}
uses
Windows, Messages;
const
APP_CLASS_NAME = 'DesktopApp';
CHILD_CLASS_NAME = 'DesktopAppChild';
var
AppWnd, ChildWnd: HWND;
WndClass: TWndClass;
function AppWndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case uMsg of
WM_CREATE:
begin
// 隐藏任务栏图标
SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
// 创建子窗口
ChildWnd := CreateWindowEx(WS_EX_TOOLWINDOW or WS_EX_TOPMOST or WS_EX_TRANSPARENT or WS_EX_LAYERED,
CHILD_CLASS_NAME, nil, WS_POPUP or WS_VISIBLE,
0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
hwnd, 0, HInstance, nil);
// 设置子窗口样式,始终显示在桌面上且不能被最小化
SetWindowLong(ChildWnd, GWL_EXSTYLE, GetWindowLong(ChildWnd, GWL_EXSTYLE) or WS_EX_TOOLWINDOW or WS_EX_TOPMOST);
// 设置主窗口大小和位置
SetWindowPos(hwnd, 0, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), SWP_NOZORDER or SWP_NOMOVE);
end;
WM_DESTROY:
begin
PostQuitMessage(0);
end;
else
Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
end;
end;
function ChildWndProc(hwnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case uMsg of
WM_CREATE:
begin
// 设置子窗口样式,始终置底
SetWindowPos(hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE);
end;
WM_DESTROY:
begin
PostQuitMessage(0);
end;
else
Result := DefWindowProc(hwnd, uMsg, wParam, lParam);
end;
end;
begin
// 注册主窗口类
ZeroMemory(@WndClass, SizeOf(WndClass));
WndClass.style := CS_HREDRAW or CS_VREDRAW;
WndClass.lpfnWndProc := @AppWndProc;
WndClass.hInstance := HInstance;
WndClass.hbrBackground := COLOR_WINDOW + 1;
WndClass.lpszClassName := APP_CLASS_NAME;
RegisterClass(WndClass);
// 注册子窗口类
ZeroMemory(@WndClass, SizeOf(WndClass));
WndClass.style := CS_HREDRAW or CS_VREDRAW;
WndClass.lpfnWndProc := @ChildWndProc;
WndClass.hInstance := HInstance;
WndClass.hbrBackground := COLOR_WINDOW + 1;
WndClass.lpszClassName := CHILD_CLASS_NAME;
RegisterClass(WndClass);
// 创建主窗口
AppWnd := CreateWindowEx(WS_EX_TOOLWINDOW,
APP_CLASS_NAME, nil, WS_POPUP or WS_VISIBLE,
0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN),
0, 0, HInstance, nil);
// 主消息循环
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
// 注销窗口类
UnregisterClass(APP_CLASS_NAME, HInstance);
UnregisterClass(CHILD_CLASS_NAME, HInstance);
end.
```
这个程序创建了一个主窗口和一个子窗口。主窗口不会在任务栏上显示图标,子窗口始终显示在桌面上且不能被最小化,而且始终置底。请注意,这个代码使用了 Windows API 中的一些函数和常量,需要在程序中包含 Windows 单元。