防止控制台应用程序在窗口移动时退出

本文介绍了一个Windows环境下控制台应用程序如何通过设置控制台处理程序来优雅地处理关闭事件的方法,包括Ctrl+C和窗口关闭等信号。

//添加函数

BOOL _ExitFlag = 0;
BOOL WINAPI ConsoleHandler(DWORD msgType)
{
    if (msgType == CTRL_C_EVENT)
    {
        //printf("Ctrl-C!\n");
        _ExitFlag = 1;
        return TRUE;
    }
    else if (msgType == CTRL_CLOSE_EVENT)
    {
        printf("Close console window!\n");
        _ExitFlag = 1;
        /* Note: The system gives you very limited time to exit in this condition */
        return TRUE;
    }
 
    /*
        Other messages:
        CTRL_BREAK_EVENT         Ctrl-Break pressed
        CTRL_LOGOFF_EVENT        User log off
        CTRL_SHUTDOWN_EVENT      System shutdown
    */
 
    return FALSE;
}

int _tmain(int argc, _TCHAR* argv[])
{
 SetConsoleCtrlHandler(ConsoleHandler, TRUE); //Main函数中添加如下代码

}

要在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、付费专栏及课程。

余额充值