C# 窗口的移动

一 窗口的移动

默认地,一个Form窗口可以通过标题栏移动,但是自定义的悬浮窗口没有标题栏,所以是不能移动的。
需要手动的实现窗口的移动:
设计思路;
① 鼠标按下时,记录窗口起始位置;
② 鼠标移动时,计算鼠标移动的位移Delta,然后将窗口移相同的位移;
③ 鼠标抬起时,结束移动操作;

思考:

new AfMoveSupport(floatBox);

创建了一个AfMoveSupport对象,却没有引用它,那这个对象会被自动销毁吗?

1 要点与细节

1 鼠标点的位置,应该转换为屏幕坐标;

相对坐标e.Location;
屏幕坐标 pos=target.PointToScreen(e.Location);

二 右键菜单

① 在Form1里,添加右键菜单;
② 手工添加MouseUp事件响应,显示右键菜单;

三 显示进度

悬浮窗口的主要用途:
① 呈现程序的状态;
② 接收拖放输入Drag&Drop;

代码实现:
①修改myFloatBox.OnPaint()
绘制出百分比的效果;
② 模拟进度显示
模拟一个下载过程,将进度呈现到悬浮窗中;

1 要点与细节

① 文字描边效果
为了突出文字的显示效果,先以粗体绘制,再以细体绘制。叠加之后类似描边的效果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C#中监听其他程序的窗口移动,你可以使用Windows API中的SetWindowsHookEx函数来安装一个钩子来捕获窗口移动的事件。以下是一个示例代码: ```csharp using System; using System.Diagnostics; using System.Runtime.InteropServices; class Program { // 定义钩子委托 private delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam); // 定义钩子类型常量 private const int WH_CALLWNDPROC = 4; // 定义Windows API函数 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); // 定义钩子回调方法 private static IntPtr HookCallback(int code, IntPtr wParam, IntPtr lParam) { // 检查钩子事件类型 if (code >= 0 && wParam == (IntPtr)0x0213) // WM_MOVING { // 获取窗口移动的信息 var movingRect = (RECT)Marshal.PtrToStructure(lParam, typeof(RECT)); // 输出窗口移动的信息 Console.WriteLine($"Window moved: Left={movingRect.left}, Top={movingRect.top}, Right={movingRect.right}, Bottom={movingRect.bottom}"); } // 调用下一个钩子 return CallNextHookEx(IntPtr.Zero, code, wParam, lParam); } // 定义窗口坐标结构体 [StructLayout(LayoutKind.Sequential)] private struct RECT { public int left; public int top; public int right; public int bottom; } static void Main() { // 获取当前进程ID int currentProcessId = Process.GetCurrentProcess().Id; // 安装钩子 IntPtr hookHandle = SetWindowsHookEx(WH_CALLWNDPROC, HookCallback, IntPtr.Zero, (uint)currentProcessId); // 等待退出程序 Console.WriteLine("按任意键退出程序..."); Console.ReadKey(); // 卸载钩子 UnhookWindowsHookEx(hookHandle); } } ``` 上述代码通过使用 SetWindowsHookEx 函数安装一个钩子来捕获窗口移动的事件。在钩子回调方法 HookCallback 中,我们检查钩子事件类型是否为窗口移动事件(WM_MOVING),然后获取窗口移动的信息并输出到控制台。 请注意,此代码需要以管理员权限运行,否则无法成功安装钩子。另外,钩子会监视整个系统中的窗口移动事件,包括其他程序的窗口移动。你可以根据自己的需求对代码进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值