因工作需求,单位的电脑都是在一个局域网内,基本所有电脑都安装好了内网远程工具,很多同事出现系统或电脑问题报障时不知道IP多少,所以就想着弄一个桌面显示的小工具。
这个工具是用豆包写的,功能比较单一,可能也还不完善,有好的建议或者技术大佬也可以优化下,目前我只测试了WIN10,源码我放下面。
这次分享主要分为4个,有需要的可以各取所需。3个的区别之处我罗列下:
1、BAT形式:该方式是使用电脑自带的CMD命令窗口进行执行的,无需安装其他程序,设置开机启动。
✅ 字体红色显示
✅ 屏幕居中,置顶最上层显示(不会被其他程序覆盖)
✅ 透明无背景
✅ 不可直接关闭、不可编辑
❌无法自动刷新IP
关闭需要任务管理器结束这个任务:Windows PowerShell
蓝奏云下载:https://wwbov.lanzout.com/i46tA3nlxqqd


[Bash shell] 纯文本查看 复制代码 @echo off
setlocal enabledelayedexpansion
set "psPath=%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe"
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /i "ipv4 地址"') do (
set "ip=%%a"
goto :break
)
:break
set "ip=%ip: =%"
if "%ip%"=="" (
echo 无法获取IP地址,请检查网络连接。
pause
exit /b
)
start /b "" "%psPath%" -WindowStyle Hidden -Command "Add-Type -AssemblyName System.Windows.Forms; $ip='%ip%'; $form=New-Object System.Windows.Forms.Form; $form.Text='IP Display'; $form.FormBorderStyle='None'; $form.ControlBox=$false; $form.ShowInTaskbar=$false; $form.TopMost=$true; $form.BackColor='Magenta'; $form.TransparencyKey='Magenta'; $form.StartPosition='Manual'; $label=New-Object System.Windows.Forms.Label; $label.Text='IP:' + $ip; $label.Font=New-Object System.Drawing.Font('Arial',17); $label.AutoSize=$true; $label.BackColor='Magenta'; $label.ForeColor='Red'; $form.Controls.Add($label); $form.ClientSize=$label.Size; $x=([System.Windows.Forms.Screen]::PrimaryScreen.Bounds.Width - $form.Width) / 2; $y=0; $form.Location=New-Object System.Drawing.Point($x,$y); $form.Add_Shown({$form.Activate()}); $form.Add_FormClosing({$_.Cancel=$true}); [void]$form.ShowDialog()"
2、EXE形式:该方式是使用Python代码编译并打包的,好处是代码不会被他人修改。
✅ 字体红色显示
✅ 屏幕居中,桌面显示(不会挡住其他程序显示)
✅ 透明无背景(有点瑕疵,部分颜色背景会有一点点白底)
✅ 不可直接关闭、不可编辑
❌Win7貌似打开会提示缺少DLL,可能依赖Python环境
蓝奏云下载:https://wwbov.lanzout.com/is6bP3nlxqre

3、EXE形式:该方式是使用Python代码编译并打包的,增加了可拖拽窗口。
✅ 字体红色显示
✅ 屏幕居中,置顶最上层显示(不会被其他程序覆盖)
✅ 透明无背景(有点瑕疵,部分颜色背景会有一点点白底)
✅ 不可直接关闭、不可编辑
✅ 窗口可拖拽(避免挡住系统内容显示)
❌Win7貌似打开会提示缺少DLL,可能依赖Python环境
蓝奏云下载:https://wwbov.lanzout.com/i0c3u3nlxqtg
[Python] 纯文本查看 复制代码 import tkinter as tk[size=5]
[/size]import socket
# ------------------ 获取本机IPv4地址 ------------------
def get_local_ip():
try:
socket.setdefaulttimeout(2)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip = s.getsockname()[0]
s.close()
return ip
except Exception:
try:
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
if ip.startswith('127.'):
return "未获取到有效IP"
return ip
except Exception:
return "获取IP失败"
# ------------------ 主窗口类 ------------------
class IPDisplay:
def __init__(self):
self.root = tk.Tk()
self.root.title("")
self.root.overrideredirect(True) # 无边框
self.root.attributes('-topmost', True) # 置顶
# 透明键颜色
self.transparent_color = "#abcdef"
self.root.config(bg=self.transparent_color)
self.root.attributes('-transparentcolor', self.transparent_color)
# 可选:工具窗口样式(消除阴影边框)
try:
self.root.wm_attributes('-toolwindow', 1)
except:
pass
# 标签:去除所有可能产生白色边缘的属性
self.label = tk.Label(
self.root,
font=("Arial", 20, "bold"),
fg="red",
bg=self.transparent_color,
text="获取IP中...",
highlightthickness=0,
bd=0
)
self.label.pack(padx=5, pady=3)
# 禁止关闭窗口
self.root.protocol("WM_DELETE_WINDOW", lambda: None)
# 拖拽相关变量
self.drag_start_x = 0
self.drag_start_y = 0
self.drag_start_win_x = 0
self.drag_start_win_y = 0
# 绑定鼠标事件到标签(点击文字即可拖拽)
self.label.bind("<Button-1>", self.on_drag_start)
self.label.bind("<B1-Motion>", self.on_drag_motion)
self.label.bind("<ButtonRelease-1>", self.on_drag_stop)
# 初始显示并居中
self.update_ip()
self._center_top() # 仅初始化时居中一次
# 定时刷新(60秒),只更新内容,不改变位置
self.refresh_interval = 60000
self.root.after(self.refresh_interval, self.refresh_loop)
self.root.mainloop()
def update_ip(self):
ip = get_local_ip()
self.label.config(text=f"IP: {ip}")
self.root.update_idletasks()
def _center_top(self):
"""将窗口置于屏幕顶部中央"""
screen_width = self.root.winfo_screenwidth()
width = self.root.winfo_reqwidth()
height = self.root.winfo_reqheight()
x = (screen_width - width) // 2
y = 0
self.root.geometry(f"{width}x{height}+{x}+{y}")
def refresh_loop(self):
"""定时刷新IP,不移动窗口位置"""
self.update_ip()
self.root.after(self.refresh_interval, self.refresh_loop)
# ------------------ 拖拽方法 ------------------
def on_drag_start(self, event):
"""记录按下时的窗口位置和鼠标位置"""
self.drag_start_x = event.x_root
self.drag_start_y = event.y_root
win_x = self.root.winfo_x()
win_y = self.root.winfo_y()
self.drag_start_win_x = win_x
self.drag_start_win_y = win_y
def on_drag_motion(self, event):
"""计算偏移量,移动窗口"""
dx = event.x_root - self.drag_start_x
dy = event.y_root - self.drag_start_y
new_x = self.drag_start_win_x + dx
new_y = self.drag_start_win_y + dy
self.root.geometry(f"+{new_x}+{new_y}")
def on_drag_stop(self, event):
"""拖拽结束,不做额外操作"""
pass
if __name__ == "__main__":
IPDisplay()
Python取消置顶比较简单注释掉这行代码就行 self.root.attributes('-topmost', True) # 置顶
我的需求比较单一简单,所以就只显示了IP地址。其他大佬如果还有其他需求可以延伸交流。谢谢!
|