C++【求助】如何写一个当用户按下Ctrl+C,返回一个值并且不会关闭的程序...
8个回答
展开全部
/*注册信号处理函数。给你个例子*/
#include <signal.h>
#include <Windows.h>
#include <iostream>
using namespace std;
void cs(int n)
{
if(n==SIGINT)
{
cout<<"\n你按下了ctrl+c"<<endl;
signal(SIGINT, cs);
return;
}
if(n==SIGBREAK)
{
cout<<"\n你按下了ctrl+break,现在退出程序\n";
exit(0);
}
}
int main()
{
char ch;
signal(SIGINT, cs); /*注册ctrl+c信号捕获函数*/
signal(SIGBREAK,cs); /*注册ctrl+break信号捕获函数*/
while(1)
{
cin>>ch;
Sleep(10);
if(cin.fail())
{
cin.clear();
cin.sync();
}
}
return 0;
}
#include <signal.h>
#include <Windows.h>
#include <iostream>
using namespace std;
void cs(int n)
{
if(n==SIGINT)
{
cout<<"\n你按下了ctrl+c"<<endl;
signal(SIGINT, cs);
return;
}
if(n==SIGBREAK)
{
cout<<"\n你按下了ctrl+break,现在退出程序\n";
exit(0);
}
}
int main()
{
char ch;
signal(SIGINT, cs); /*注册ctrl+c信号捕获函数*/
signal(SIGBREAK,cs); /*注册ctrl+break信号捕获函数*/
while(1)
{
cin>>ch;
Sleep(10);
if(cin.fail())
{
cin.clear();
cin.sync();
}
}
return 0;
}
展开全部
100分让我进来的,但是无从下手。
1. 请明确需求
1.1 该用户使用图形界面还是字符界面?
1.2 如果图形界面,Ctrl + C 只是复制的默认快捷键,这个是系统定义的,你只要在自己的程序里面覆写这个快捷键就可以了。Hook 可以做到。
1.3 字符界面同样也是如此。
等你明确了需求,程序是很容易写出来的。
1. 请明确需求
1.1 该用户使用图形界面还是字符界面?
1.2 如果图形界面,Ctrl + C 只是复制的默认快捷键,这个是系统定义的,你只要在自己的程序里面覆写这个快捷键就可以了。Hook 可以做到。
1.3 字符界面同样也是如此。
等你明确了需求,程序是很容易写出来的。
追问
命令行界面。具体怎么做呀
追答
哇噻,200分了,还在线等,呵呵。
这样,第一种方法,用signal :
#include
#include
#include
#include
BOOL WINAPI ConsoleHandler(
DWORD dwCtrlType // control signal type
);
int main(int argc, char *argv[])
{
if (SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ConsoleHandler, TRUE) == FALSE)
{
// unable to install handler...
// display message to the user
printf("Unable to install handler!\n");
return -1;
}
while(true)
{
}
}
BOOL WINAPI ConsoleHandler(DWORD CEvent)
{
char mesg[128];
switch(CEvent)
{
case CTRL_C_EVENT:
MessageBox(NULL,
_T("CTRL+C received!"),_T("CEvent"),MB_OK);
std::cout << "控制台输出" << std::endl;
break;
}
return TRUE;
}
第二种方法,使用 SetConsoleMode 函数,你查一下MSDN,这个可以设定console 模式,来屏蔽Ctrl+C 这个终止控制台程序的组合键,代之以传给你指定的某个进程。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
DOS 下的程序
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define ABORT 0
#define CONTINUE -1
int c_break(void)
{
int ch;
printf("Control-C pressed, Exit program? (Y/N)\n");
ch = getch();
if(ch=='Y'||ch=='y')
return (ABORT);
else
return(CONTINUE);
}
void main(void)
{
ctrlbrk(c_break);
for(;;)
{
printf("Looping... Press <Ctrl-C> to quit:\n");
}
}
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define ABORT 0
#define CONTINUE -1
int c_break(void)
{
int ch;
printf("Control-C pressed, Exit program? (Y/N)\n");
ch = getch();
if(ch=='Y'||ch=='y')
return (ABORT);
else
return(CONTINUE);
}
void main(void)
{
ctrlbrk(c_break);
for(;;)
{
printf("Looping... Press <Ctrl-C> to quit:\n");
}
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
Ctrl+C会关闭程序。。。是DOS命令行界面吧,这个底下就不要想了,费事不说,程序出来实在是没什么用。
如果是课程作业什么的,不建议和这个较劲,费事不讨好。
如果是项目工作。。。额。。这个好像不会用DOS命令行界面吧
如果是课程作业什么的,不建议和这个较劲,费事不讨好。
如果是项目工作。。。额。。这个好像不会用DOS命令行界面吧
追问
唉、就是项目工作啊。帮帮忙吧、想到蛋疼。
追答
项目??这个有点晕。。。很久很久没弄DOS底层了,应该是可以通过预先的系统函数调用关闭这些东西,但想不起来了。现在家里没有虚拟工作环境,没法帮你试。看看楼下的ctrlbrk行不行吧。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是Linux下就好了,信号通信,重新定义Ctrl+C事件 要执行的函数就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询