This commit is contained in:
e0x1a 2024-10-27 09:23:50 +00:00
commit 74206e2982
54 changed files with 6106 additions and 0 deletions

View File

@ -0,0 +1,61 @@
//string + *
#include<iostream>
using namespace std;
string operator *(string a,string b)
{
string c;
int al=a.length(),bl=b.length(),cl=0;
int *ci;
ci=new int[al+bl+5];
for(int i=0;i<(al+bl+5);i++)ci[i]=0;
for(int i=0;i<al;i++) a[i]=a[i]-48;
for(int i=0;i<bl;i++) b[i]=b[i]-48;
for(int j=0;j<bl;j++)
for(int i=0;i<al;i++)
ci[i+j]+=a[al-i-1]*b[bl-j-1];
for(int i=0;i<(al+bl+3);i++)
{
ci[i+1]+=ci[i]/10;
ci[i]%=10;
if(ci[i+1]!=0)cl=i+1;
}
c.resize(cl+1);
for(int i=0;i<=cl;i++)
c[i]=ci[cl-i]+48;
delete []ci;
return c;
}
string operator+(string a,string b)
{
string c;
int al=a.length(),bl=b.length(),cl=0;
int l=al>bl?al:bl;
c.resize(l+3);
for(int i=0;i<al;i++)a[i]=a[i]-48;//string转int
for(int i=0;i<bl;i++)b[i]=b[i]-48;
for(int i=0;i<(l+3);i++)c[i]=0;//c初始化
for(int i=0;i<l;i++)//加法计算核心
{
if((al-i-1)>=0)c[i]=a[al-i-1]+c[i];
if((bl-i-1)>=0)c[i]=b[bl-i-1]+c[i];
}
for(int i=0;i<(l+2);i++)//处理进位
{
c[i+1]+=c[i]/10;
if(c[i+1]!=0)cl=i+1;
c[i]=c[i]%10+48;
}
if(c[cl]<10)c[cl]+=48;
char t; //c反转
for(int i=0;i<=cl/2;i++){t=c[i];c[i]=c[cl-i];c[cl-i]=t;}
c.resize(cl+1);
return c;
}
int main()
{
string a,b;
cin>>a>>b;
cout<<a*b;
return 0;
}

View File

@ -0,0 +1,55 @@
//Copyright(c) 2024 e0x1a&ly. All right reserved.
#include<iostream>
#include<vector>
using namespace std;
void init(vector<int> &a)
{
for(int i=1; i < a.size(); i++)
{
int lowbit=(i & -i)>>1;
while(lowbit)
{
a[i]+=a[i-lowbit];
lowbit=lowbit>>1;
}
}
}
void add(int x,int k,vector<int> &a)
{
for(; x < a.size(); x+=(x & -x)) a[x]+=k;
}
int ask(int x,vector<int> &a)
{
int ans=0;
while(x) { ans+=a[x];x-=(x & -x);}
return ans;
}
int main()
{
//data init
int n,m,temp;
vector<int>a;a.push_back(0);
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)
{
scanf("%d",&temp);
a.push_back(temp);
}
init(a);
while(m--) //在线操作
{
int x,y;
scanf("%d%d%d",&temp,&x,&y);
if(temp==1)
add(x,y,a);
else printf("%d\n",ask(y,a)-ask(x-1,a));
}
return 0;
}

View File

@ -0,0 +1,37 @@
#include<bits/stdc++.h>
using namespace std;
int f[100001][30],n,m;
void init(int n)//计算区间预处理
{
for(int i = 1;1<<i <= n;i++)
for(int j = 1;(j+(1<<i)-1) <= n;j++)
//f[j][i] = max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
{int k=i-1;f[j][i] = f[j][k]>f[j+(1<<(k))][k] ? f[j][k] : f[j+(1<<(k))][k];}
}
inline int query(int L,int R)//查询
{
int s = log2(R-L+1);
//return max(f[L][s],f[R-(1<<s)+1][s]);
return f[L][s]>f[R-(1<<s)+1][s] ? f[L][s] : f[R-(1<<s)+1][s];
}
inline int read()//快读int
{
int data=0;bool n=false;char ch;
while(1){if((ch=getchar())==EOF)return -1;if(!isdigit(ch)){if(n==true)break;else continue;}n=true;data=data*10+(int)(ch-48);}
return data;
}
int main()
{
cin>>n>>m;
for(int i = 1;i <= n;i++)f[i][0]=read();//读入数据
init(n);
int L,R;
while(m--)
{
L=read();R=read();
printf("%d\n",query(L,R));
}
return 0;
}

View File

@ -0,0 +1,24 @@
#include<iostream>
using namespace std;
bool zs(int a)
{
for(int i=2;i*i<=a;i++)if(a%i==0)return false;
return true;
}
int main()
{
int l,max=0;
cin>>l;
for(int i=2;l<i;i++)
{
if(zs(i))
{
cout<<i<<endl;
l=l-i;
cout<<l<<endl;
max++;
}
}
cout<<max;
return 0;
}

26
c++/algorithms/main.cpp Normal file
View File

@ -0,0 +1,26 @@
// Copyright (c) 2024 ely. All rights reserved.
#include<iostream>
#include<cstdio>
#include<cmath>
#include<time.h>
#include<cstring>
#include<vector>
#include<fstream>
#include<algorithm>
using namespace std;
inline int read()//快读int
{
int data=0;char ch;
while(1){ch=getchar();if(ch<'0' || ch>'9'){if(data!=0)break;}else data=data*10+(int)(ch-48);}
return data;
}
int main()
{
// freopen("in","r",stdin);
// ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
return 0;
}

111
c++/algorithms/xds_mod.cpp Normal file
View File

@ -0,0 +1,111 @@
// Copyright (c) 2024 e0x1a.ly. All rights reserved.
#include<iostream>
using namespace std;
class Node
{
public:
Node(){c_l=c_r=c_max=c_sum=c_lag=0;tl=NULL;tr=NULL;}
void build(int *arr,int l,int r)
{
c_l=l;c_r=r;
if(l==r) {c_max=arr[l];c_sum=arr[l];}
else {
tl=new Node;tr=new Node;
tl->build(arr,l,(l+r)/2);
tr->build(arr,(l+r)/2+1,r);
c_max = tl->c_max > tr->c_max ? tl->c_max:tr->c_max;
c_sum = tl->c_sum + tr->c_sum;
}
}
void print(int cnt=1)
{
printf("%5d---%5d---%5d\n",cnt,c_max,c_sum);
if(c_l != c_r)
{
tl->print(cnt+1);
tr->print(cnt+1);
}
}
int ask_max(int l,int r)
{
if(c_l >= l && c_r <= r)
return c_max;
int t_max1=0,t_max2=0;
if((c_l+c_r)/2 < r) t_max1=tr->ask_max(l,r);
if((c_l+c_r)/2+1 > l) t_max2=tl->ask_max(l,r) ;
return t_max1 > t_max2 ? t_max1 : t_max2;
}
int ask_sum(int l,int r)
{
if(c_l >= l && c_r <= r)
return c_sum;
int t_sum1=0,t_sum2=0;
if((c_l+c_r)/2 < r) t_sum1=tr->ask_sum(l,r);
if((c_l+c_r)/2+1 > l) t_sum2=tl->ask_sum(l,r) ;
return t_sum1 + t_sum2;
}
void change(int x,int value)
{
if(c_l == x && c_r == x)
c_max=c_sum=value;
else {
if((c_l+c_r)/2+1 >x) tl->change(x,value);
else tr->change(x,value);
c_max = tl->c_max > tr->c_max ? tl->c_max:tr->c_max;
c_sum = tl->c_sum + tr->c_sum;
}
}
void add(int l,int r,int value)
{
if(c_l >= l && c_r <= r)
{
if(c_l==c_r)
c_sum=c_max+=value;
else {
c_lag+=value;
}
} else if(c_l != c_r){
if(l <= (c_l+c_r)/2) tl->add(l,r,value);
if(r > (c_l+c_r)/2) tr->add(l,r,value);
c_max = tl->c_max > tr->c_max ? tl->c_max:tr->c_max;
c_sum = tl->c_sum + tr->c_sum;
}
}
private:
int c_l,c_r,c_max,c_sum,c_lag;
Node *tl,*tr;
};
int main()
{
Node s;
int *arr,n;
cin>>n;
arr=new int[n+1];arr[0]=n;
for(int i=1;i<(n+1);i++)
cin>>arr[i];
s.build(arr,1,n);
s.print();
while(1)
{
int x,y,v;
cin>>n;
if(!n)break;
switch(n)
{
case 1: cin>>x>>y;s.change(x,y);break;
case 2: cin>>x>>y;cout<<s.ask_max(x,y)<<endl;break;
case 3: cin>>x>>y>>v;s.add(x,y,v);break;
case 4: cin>>x>>y;cout<<s.ask_sum(x,y)<<endl;break;
}
}
return 0;
}

23
c++/linux/dir.cpp Normal file
View File

@ -0,0 +1,23 @@
#include<iostream>
#include<unistd.h>
#include<dirent.h>
using namespace std;
int main()
{
char buf[255];
if(getcwd(buf, 255) == NULL)
cout << "error" << endl;
else cout << buf << endl;
DIR *ddir;
if((ddir = opendir(buf)) == NULL)
cout << "error" << endl;
struct dirent* entry;
while((entry = readdir(ddir)) != NULL)
cout << entry->d_name << endl;
closedir(ddir);
return 0;
}

153
c++/linux/fork Normal file
View File

@ -0,0 +1,153 @@
在Linux系统中`fork` 是一个系统调用,用于创建一个新的进程,这个新进程是调用进程的一个副本。这个新进程被称为子进程,而调用进程被称为父进程。`fork` 调用在父进程中返回子进程的PID进程标识符而在子进程中返回0。
以下是使用 `fork` 函数的基本步骤:
1. **包含头文件**:使用 `fork` 函数之前,需要包含 `<unistd.h>` 头文件。
2. **调用 fork**:在代码中调用 `fork()` 函数。
3. **检查返回值**`fork()` 调用会返回一个整数。如果返回值为正数表示在父进程中返回的值是子进程的PID。如果返回值为0表示在子进程中。如果返回值为-1表示创建进程失败。
4. **父进程和子进程的执行流程**:在 `fork()` 调用之后,根据返回值判断当前是在父进程还是子进程,并执行相应的代码。
下面是一个简单的示例代码,展示了如何使用 `fork`
```c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid = fork(); // 创建子进程
if (pid < 0) {
// fork失败
fprintf(stderr, "Fork failed");
return 1;
} else if (pid == 0) {
// 子进程
printf("I'm the child process with PID: %d\n", getpid());
} else {
// 父进程
printf("I'm the parent process with PID: %d, and my child is %d\n", getpid(), pid);
}
return 0;
}
```
当使用 `fork` 系统调用创建子进程时,子进程会继承父进程的许多资源。以下是父子进程共享的一些主要资源:
1. **文件描述符**:子进程会继承父进程打开的所有文件描述符。这意味着子进程可以访问父进程打开的文件和设备。
2. **环境变量**:子进程继承父进程的环境变量,包括语言设置、路径变量等。
3. **内存空间**:子进程会复制父进程的地址空间,包括代码段、数据段和堆栈。但是,子进程的堆栈是独立的,这意味着局部变量和函数调用栈是分开的。
4. **信号处理器**:子进程继承父进程的信号处理器设置。
5. **挂起信号集**:子进程继承父进程的挂起信号集。
6. **资源限制**子进程继承父进程的资源限制如CPU时间、文件大小限制等。
7. **进程组ID**子进程继承父进程的进程组ID。
8. **用户ID和组ID**子进程继承父进程的用户ID和组ID。
9. **工作目录**:子进程继承父进程的工作目录。
10. **根目录**:子进程继承父进程的根目录。
11. **能力**:子进程继承父进程的文件系统能力。
12. **内核定时器**:如果父进程有设置内核定时器,子进程也会继承。
13. **锁**:子进程继承父进程持有的文件锁。
14. **共享内存段**:如果父进程使用了共享内存,子进程也会继承这些共享内存段。
15. **网络连接**:子进程继承父进程的网络连接。
然而,有一些资源是独立的,例如:
- **进程ID**子进程有自己的唯一进程ID。
- **线程特定数据**:每个线程有自己的线程特定数据,子进程不会继承父进程的线程特定数据。
- **CPU寄存器**除了程序计数器和其他一些寄存器外子进程的CPU寄存器状态是复制自父进程的但子进程可以独立修改它们。
在 `fork` 之后,通常使用 `exec` 系列函数来替换子进程的映像,这样可以避免共享不必要的资源,并且可以运行一个完全不同的程序。此外,使用 `fork` 时需要注意资源的同步和清理,以避免潜在的资源竞争和泄漏问题。
下面是一个详细的示例代码展示了如何在C语言中使用 `fork` 系统调用,并演示了父子进程共享资源的基本概念:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
int main() {
pid_t pid = fork(); // 创建子进程
if (pid < 0) {
// fork失败
exit(EXIT_FAILURE);
} else if (pid == 0) {
// 子进程
// 子进程可以继续使用父进程打开的文件描述符
// 例如,这里我们尝试写入标准输出
printf("Hello from the child process!\n");
// 子进程可以修改父进程传递给它的变量的值,但这些修改不会影响父进程
int child_value = 42;
printf("Child value: %d\n", child_value);
} else {
// 父进程
// 父进程可以等待子进程结束
int status;
wait(&status); // 等待子进程结束
// 检查子进程是否正常退出
if (WIFEXITED(status)) {
printf("Child exited with status %d\n", WEXITSTATUS(status));
}
}
// 父进程和子进程都可以访问这个变量,但它们有自己的副本
// 这里我们演示父进程的值不会影响子进程
int shared_variable = 10;
printf("Parent shared variable: %d\n", shared_variable);
return 0;
}
```
在这个示例中:
- 我们首先调用 `fork()` 来创建一个新的子进程。
- 如果 `fork()` 返回一个负值,表示创建进程失败,我们打印错误消息并退出。
- 如果 `fork()` 返回0表示当前是在子进程中。子进程打印自己的PID和PPID父进程ID并写入标准输出。
- 如果 `fork()` 返回一个正值表示当前是在父进程中。父进程打印自己的PID和PPID并等待子进程结束。
- 使用 `wait()` 函数可以让父进程挂起,直到子进程结束。`wait()` 函数还可以获取子进程的退出状态。
- 我们定义了一个 `shared_variable` 变量,并在父进程和子进程中分别打印它的值。由于子进程的栈是独立的,所以子进程中的修改不会影响父进程中的 `shared_variable`。
在使用 `fork` 系统调用创建子进程时,通常会结合其他一些系统调用或库函数来实现特定的功能。以下是一些与 `fork` 相关的常用函数:
1. **exec 系列函数**
- `execl(const char *path, const char *arg0, ..., NULL)`
- `execv(const char *path, char *const argv[])`
- `execle(const char *path, const char *arg0, ..., NULL, char *const envp[])`
- `execve(const char *path, char *const argv[], char *const envp[])`
- `execlp(const char *file, const char *arg0, ..., NULL)`
- `execvp(const char *file, char *const argv[])`
这些函数用于在子进程中执行一个新的程序,替换当前的进程映像。
2. **wait 和 waitpid 函数**
- `wait(int *status)`
- `waitpid(pid_t pid, int *status, int options)`
这些函数用于父进程等待子进程结束。`wait` 函数等待任何一个子进程结束,而 `waitpid` 可以指定等待特定的子进程。
3. **_exit 和 exit 函数**
- `_exit(int status)`
- `exit(int status)`
这两个函数用于终止进程。`_exit` 立即终止进程,不进行任何清理工作;`exit` 在终止进程前会执行一些清理工作如关闭标准I/O流、刷新缓冲区等。
4. **getpid 和 getppid 函数**
- `pid_t getpid(void)`
- `pid_t getppid(void)`
`getpid` 返回调用进程的PID`getppid` 返回调用进程的父进程PID。
8. **signal 和 sigaction 函数**
- `int signal(int signum, void (*handler)(int))`
- `int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact)`
这些函数用于设置信号处理器,处理进程接收到的信号。
9. **kill 函数**
- `int kill(pid_t pid, int sig)`
`kill` 函数用于向指定的进程发送信号。
10. **setsid 函数**
- `pid_t setsid(void)`
`setsid` 用于创建一个新的会话,并使调用进程成为该会话的领头进程。
这些函数在进程管理、信号处理、资源管理等方面起着重要作用,与 `fork` 结合使用可以实现复杂的进程间操作和通信。

63
c++/linux/linux.h Normal file
View File

@ -0,0 +1,63 @@
linux系统头文件
1. **`stdio.h`** - `printf``scanf``fopen``fclose`
2. **`stdlib.h`** - `malloc``free``rand``exit`
3. **`string.h`** - `strcpy``strlen``strcat`
4. **`errno.h`** -
5. **`limits.h`** -
6. **`fcntl.h`** -
7. **`sys/types.h`** - `size_t``off_t`
8. **`sys/stat.h`** -
9. **`sys/time.h`** -
10. **`sys/resource.h`** -
11. **`sys/wait.h`** -
12. **`sys/ioctl.h`** -
13. **`sys/socket.h`** -
14. **`netinet/in.h`** -
15. **`arpa/inet.h`** -
16. **`netdb.h`** -
17. **`signal.h`** -
18. **`setjmp.h`** -
19. **`time.h`** -
20. **`pthread.h`** - POSIX 线
21. **`dlfcn.h`** -
22. **`dirent.h`** -
23. **`grp.h`** -
24. **`pwd.h`** -
25. **`termios.h`** -
26. **`sys/mman.h`** -
27. **`sys/shm.h`** -
28. **`sys/ipc.h`** -
29. **`sys/msg.h`** -
30. **`sys/sem.h`** -
C

65
c++/net/1.cpp Normal file
View File

@ -0,0 +1,65 @@
#include <iostream>
#include <cstring>
//#include <cstdlib>
#include <unistd.h>
#include <netdb.h>
//#include <sys/types.h>
//#include <sys/socket.h>
//#include <arpa/inet.h>
using namespace std;
int net_send(char *argv[], char *buffer) {
if(strlen(buffer) > 1024) {
cout << "字符串长度超出限制" << endl; return -1;
}
// 创建客户端socket
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd == -1) {
cout << "socket创建失败" << endl; return -1;
}
// 向服务端请求连接
struct hostent* h;
if( (h = gethostbyname(argv[1])) == 0) {
cout << "地址不正确" << endl; close(sockfd); return -1;
}
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2])); //指定连接端口
memcpy(&servaddr.sin_addr, h->h_addr, h->h_length);
if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) { //发起连接请求
cout << "连接失败" << endl; close(sockfd); return -1;
}
// 客户端通信
if(send(sockfd, buffer, strlen(buffer), 0) <= 0) { //发送请求报文
cout << "请求报文发送不成功" << endl; return -1;
}
//接收服务端回应报文, recv()将阻塞等待
memset(buffer, 0, sizeof(buffer));
if(recv(sockfd, buffer, sizeof(buffer), 0) <= 0) {
cout << "服务器断开--未成功接收回应报文" << endl; return -1;
}
// 回应报文
cout << buffer << endl;
//关闭连接
close(sockfd);
return 0;
}
int main(int argc, char *argv[]) {
if(argc != 3) {
cout << "参数不正确" << endl; return -1;
}
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
cout << "input data : ";
fgets(buffer, sizeof(buffer), stdin);
net_send(argv, buffer);
return 0;
}

73
c++/net/2.cpp Normal file
View File

@ -0,0 +1,73 @@
#include <iostream>
#include <cstring>
//#include <cstdlib>
#include <unistd.h>
#include <netdb.h>
//#include <sys/types.h>
//#include <sys/socket.h>
//#include <arpa/inet.h>
using namespace std;
int handling(char *buffer) { // 数据处理函数
if(strcmp(buffer, "off\n") == 0) {
cout << "服务端指令关闭服务器" << endl; return -1;
}
cout << "成功接收" << endl << buffer << endl;
return 0;
}
int main(int argc, char *argv[]) {
if(argc != 2) {
cout << "参数不正确" << endl; return -1;
}
// 创建服务端socket
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
if(listenfd == -1) {
cout << "socket创建失败" << endl; return -1;
}
// 向客户端请求连接
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
servaddr.sin_port = htons(atoi(argv[1])); //指定连接端口
// 绑定服务端IP及端口
if(bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) != 0) {
cout << "端口未成功绑定" << endl; close(listenfd); return -1;
}
// 把端口设为监听
if(listen(listenfd, 5) != 0) {
cout << "端口无法监听" << endl; close(listenfd); return -1;
}
// 受理客户端连接请求, accept()阻塞等待
int clistenfd;
while(true) {
clistenfd = accept(listenfd, 0, 0);
if(clistenfd == -1) {
cout << "未正常受理连接" << endl; close(listenfd); return -1;
}
cout << "客户端已连接" << endl;
//与客户端通信
char buffer[1024];
memset(buffer, 0, sizeof(buffer));
if(recv(clistenfd, buffer, sizeof(buffer), 0) <= 0) { // 接受服务端报文
cout << "客户端连接已断开" << endl; break;
}
if(handling(buffer) == -1) break; //对接受数据进行处理
// 发送回应报文
strcpy(buffer, "OK");
if(send(clistenfd, buffer, strlen(buffer), 0) <= 0) {
cout << "发送回应报文失败" << endl; break;
}
}
//关闭连接
close(clistenfd);
close(listenfd);
return 0;
}

5
c++/net/makefile Normal file
View File

@ -0,0 +1,5 @@
main: 1.cpp 2.cpp
g++ -o 1.out 1.cpp
g++ -o 2.out 2.cpp
clear:
rm *.out

110
c++/net/note Normal file
View File

@ -0,0 +1,110 @@
```cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <netdb.h>
#include <cstdlib>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
```
# tips
+ 所有网络函数失败基本是返回 -1,errno被设置
# socket
原型: int socket(int domain, int type, int protocol)
+ domain 协议族
\ PF_INET # IPv4 互联网协议族
\ PF_INET6 # IPv6 互联网协议族
\ PF_LOCAL # 本地通讯地址族
+ type 数据传输类型
\ SOCK_STREAM # 面向连接; 数据不丢失; 数据顺序不错乱; 双向通道;
\ SOCK_DGRAM # 无连接; 数据可能丢; 数据可能错乱; 效率高;
+ protocol 最终使用协议
\ IPPROTO_TCP
\ IPPROTO_UDP
\ 0 # 编译器自动识别
# 主机字节序和网络字节序
+ 大端序和小端序 (如果数据大于1B,CPU在内存中存放数据的方式)
\ 大端序 低位字节在高位,高位字节在低位
\ 小端序 低位字节在低位,高位字节在高位 (INTEL)
## 字节序不同的系统字节传输数据,可能会出现问题,所以网络字节序约定使用大端序
+ c提供了4个库用于主机字节序和网络字节序之间的转换
\ uint16_t htons(uint16_t hostshort); // 2字节的整数
\ uint32_t htonl(uint32_t hostshort); // 4字节的整数
\ uint16_t ntons(uint16_t netshort); // 2字节的整数
\ uint32_t ntonl(uint32_t netshort); // 4字节的整数
// h host主机
// to 转换
// n network网络
// s short(2byte)
// l long(4byte)
# IP地址和通讯端口
+ IPv4(4byte) 端口(2byte)
# 大小端序的处理
+ 在网络编程中数据收发有自动转换,只有sockaddr_in结构成员变量填充数据时才需要考虑字节序
# 结构体
## sockaddr
```cpp
struct sockaddr { // connect() bind() 都需要
unsigned short sa_family; // 协议族
unsigned char sa_data[14]; // 14byte的端口和地址
}
```
## sockaddr_in
```cpp
struct sockaddr { // 为了方便操作大小与sockaddr相同可以强制转换
unsigned short sin_family; // 协议族
unsigned short sin_port; // 2byte端口号
//struct in_addr sin_addr; // 4byte地址
unsigned int sin_addr; // 4byte地址
unsigned char sin_zero[8]; // 保留,长度对齐
}
```
# gethostbyname函数
+ 用 域名/主机名/字符串IP 转换成大端序
```cpp
struct hostent *gethostbyname(const char *name);
struct hostent {
char *h_name; // 主机名
char **h_aliases; // 主机所有别名的字符串数组
short h_addrtype; // 主机IP类型,IPv4或IPv6
short h_length; // 主机IP长度
char **h_addr_list; // 主机IP地址,以网络字节序存储
}
#define h_addr h_addr_list[0]
// 转换后,用 memcpy(&servaddr.sin_addr, h->h_addr, h->h_length);
```
# 字符串IP和大端序IP的转换
## atoi() 把字符串IP转换成大端序
```cpp
typedef unsigned int in_addr_t; //4byte大端序IP
// 字符串转大端序IP,转换后IP赋给sockaddr_in.in_addr.s_addr
in_addr_t inet_addr(const char *cp);
// 字符串转大端序IP,转换后IP赋给sockaddr_in.in_addr
int inet_aton(const char *cp, struct in_addr *inp);
//大转字符串,用于服务端解析IP
char *inet_ntoa(struct in_addr in);
```

25
c++/tool/g++ Normal file
View File

@ -0,0 +1,25 @@
g++ -S test.s test.cpp #编译成汇编文件
g++ -c test.o test.s #目标文件
g++ -o test test.o #链接
#静态库制作:
g++ -c -o libtest.a {test.cpp 源代码文件清单}
// g++ -c test.cpp
// ar -crv libtest.a test.o
#动态库制作
g++ -fPIC -shared -o libtest.so {test.cpp 源代码文件清单}
// g++ -fPIC -c test.cpp
// g++ -shared -o libtest.so tset.o
两种方法
1 + .so 放到 /usr/lib 或 /lib
2 + 路径放到/etc/ld.so.conf 运行ldconfd 重建/etc/ld.so.cache
# 库使用
g++ -o main -l库名 -L库路径
// g++ -o main -ltest -L/home/e0x1a/test
如果是动态库,需要指定 LD_LIBRARY_PATH 环境变量 //待查
用 echo $LD_LIBRARY_PATH 查看

112
c++/universal/IO.txt Normal file
View File

@ -0,0 +1,112 @@
一、输入输出流的概念
在C++中输入输出是同流来完成的。C++的输出操作将一个对象的状态转换成一个字符序列,输出到某个地方。
输入操作也是从某个地方接收到一个字符序列,然后将其转换成一个对象的状态所要求的格式。
这看起来很像数据在流动,于是把接收输出数据的地方叫做目标,把输入数据来自的地方叫做源。
而输入和输出操作可以看成字符序列在源、目标以及对象之间的流动。
二、文件流的概念
在C++里文件操作是通过流来完成的。C++总共有输入文件流、输出文件流和输入输出文件流3种并已将它们标准化。
1、要打开一个输入文件流需要定义一个 ifstream类型的对象。->Input-stream
2、要打开一个输出文件流需要定义一个 ofstream类型的对象。->Ouput-stream
3、如果要打开输入输出文件流则要定义一个 fstream类型的对象。->File-stream
这3种类型都定义在头文件 fstream 里。
一个输出流对象是信息流动的目标ofstream是最重要的输出流。
一个输入流对象是数据流动的源头ifstream是最重要的输入流。
一个iostream对象可以是数据流动的源或目标fstream就是从它派生的。
三、文件操作
可以总结出对文件进行操作的方法如下:
1包含头文件 <fstream>
2创建一个流对象
3将这个流和相应的文件关联起来
#include<iostream>
#include<fstream> //1、包含输入输出流头文件
using namespace std;
void outstream(){
ofstream ofs; //2、打开一个相应的文件流
ofs.open("mytest.txt"); //3、流与文件关联上
};
int main(){
return 0;
}
因为ifstream、ofstream和fstream这3个类都具有自动打开文件的构造函数而这个构造函数就具有 open() 的功能。
因此我们可以在创建流对象的时候就可以关联文件ofstream myStream("myText.txt");
4操作文件流 👇
1、文本文件
1.1、写文件
注意:
我们在写文件的时候如果打开的文件不存在或者路径错误那么会自动生成一个文件!!!
open函数的原型如下
void open(char const *,int filemode,int =filebuf::openprot);
它有3个参数第1个是要打开的文件名第2个是文件的打开方式第3个是文件的保护方式一般都使用默认值。
第2个参数可以取如下所示的值
打开方式 解释
ios::in 打开文件进行读操作,这种方式可避免删除现存文件的内容
ios::out 打开文件进行写操作,这是默认模式
ios::ate 打开一个已有的输入或输出文件并查找到文件尾开始
ios::app 在文件尾追加方式写文件
ios::binary 指定文件以二进制方式打开,默认为文本方式
ios::trunc 如文件存在,将其长度截断为零并清除原有内容,如果文件存在先删除,再创建
除ios_base::app方式之外在其他几种方式下文件刚刚打开是指示当前读写位置的文件指针都定位于文件的开始位置而ios_base::app使文件当前的写指针定位于文件尾。这几种方式也可以通过 “或” 运算符 “|” 同时使用
如果指定文件路径,路径中的“\”号必须使用转义字符表示。
案例:
void outperint() {
ofstream ofs; //打开一个写的文件流
ofs.open("test.txt", ios::out); //把这个流和文件关联起来
ofs << "姓名:张三" << endl;
ofs << "年龄18" << endl;
ofs << "性别:男" << endl;
ofs.close(); //操作完成记得close()关闭
}
1.2、读文件
函 数 功 能
函数 功能
bad() 如果进行非法操作返回true否则返回false
clear() 设置内部错误状态,如果用缺省参量调用则清除所有错误位
eof() 如果提取操作已经到达文件尾则返回true否则返回false
good() 如果没有错误条件和没有设置文件结束标志返回true否则返回false
fail() 与good相反操作失败返回false否则返回true
is_open() 判定流对象是否成功地与文件关联若是返回true否则返回false
void inputfile() {
ifstream ofs;
ofs.open("test.txt", ios::in);
if (ofs.is_open()) {
cout << "已成功和文件关联!!!" << endl;
//两种方式
//第一种
char chr[1024];
while (ofs >> chr) {
cout << chr << endl;
}
//第二种
char buf[1024] = { 0 };
while (ofs.getline(buf, sizeof(buf)));
{
cout << buf << endl;
}
};
if (!ofs.is_open()) { //不为真
cout << "尚未与文件关联!!!" << endl;
}
ofs.close();
随机存取
seekg(pos,ios::);
seekg(pos);
seekp(pos,ios::);
seekp(pos);
tellg(pos,ios::);
tellg(pos);
tellp(pos,ios::);
tellp(pos);

16
c++/universal/fast Normal file
View File

@ -0,0 +1,16 @@
C++代码性能优化的方法
1. 使用const关键字
2. 避免频繁进行内存分配和释放
3. 尽量减少值传递,多用引用来传递参数
4. 局部变量VS静态变量多次调用局部更快因为局部变量可以读入寄存器静态不行
5. ++i和i++引申出的效率问题(某些情况下,使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构
6. 避免使用多重继承
7. 低级代码使用位运算替代算术运算
8. 使用编译器自带的优化选项
9. 将小粒度函数声明为内联函数inline
10. 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定
11. 小函数放在同一循环内效率高大函数分开放效率更高由cpu寄存器决定
12. 尽量少使用dynamic_cast
13. 减少除法运算的使用,除数尽量使用常量,让编译器有空间优化
14. 多用直接初始化
15. 循环展开加速

53
c++/universal/include.txt Normal file
View File

@ -0,0 +1,53 @@
头函数库
#include<bits/stdc++.h>//万能头,包括大部分头文件。
#include <ctype.h>//字符处理
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> //复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <errno.h>//定义错误码
#include <float.h>//浮点数处理
#include <fstream.h>//文件输入/输出
#include <fstream>
#include <iomanip.h>//参数化输入/输出
#include <iostream.h> //数据流输入/输出
#include <limits.h> //定义各种数据类型最值常量
#include <locale.h> //定义本地化函数
#include <math.h> //定义数学函数
#include <stdio.h> //定义输入/输出函数
#include <stdlib.h> //定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <strstrea.h> //基于数组的输入/输出
#include <time.h> //定义关于时间的函数
#include <wchar.h> //宽字符处理及输入/输出
#include <wctype.h> //宽字符分类
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <deque> //STL 双端队列容器
#include <exception> //异常处理类
#include <functional> //STL 定义运算函数(代替运算符)
#include <limits>
#include <list> //STL 线性列表容器
#include <map> //STL 映射容器
#include <iomanip>
#include <ios> //基本输入/输出支持
#include <iosfwd> //输入/输出系统使用的前置声明
#include <iostream>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <queue> //STL 队列容器
#include <set> //STL 集合容器
#include <sstream> //基于字符串的流
#include <stack> //STL 堆栈容器
#include <stdexcept> //标准异常类
#include <streambuf> //底层输入/输出支持
#include <string> //字符串类
#include <utility> //STL 通用模板类
#include <vector> //STL 动态数组容器
#include <windows.h>

92
c++/universal/string.txt Normal file
View File

@ -0,0 +1,92 @@
# c风格字符串处理函数
strcpy(buf, "hello"); // 用后面的字符串覆盖前面的字符串
strncpy(buf, "hello", 5); // 增加指定长度
strcat(buf, "hello"); // 连接字符串
strncat(buf, "hello", 5);
strcmp(buf, "hello"); // 比较字符串,相等返回0
strlen(buf); // 返回长度,不包括'\0'
strstr(buf, "hello"); // 返回第一次出现子串的指针
strtok(buf, " "); // 分割字符串,返回分割过的字符串
memset(buf, 0, sizeof(buf));//覆写内存块
memcpy(buf, "hello", 5); //复制内存块
memmove(buf + 1, buf, 4); //移动5个字节到前一个位置
# string
## 构造
string(); // 默认构造,创建一个空的字符串
string(const char &str); // c风格字符串初始化
string(int n,char c); // 用字符填充一个字符串
## 赋值
string& operator=(const char* str); // c风格字符串赋值给当前string类
string& operator=(const string& str); // 另一个容器复制
string& operator=(const cahr c); // 字符赋值
## 存取
char& operator[](int n); // 通过[]获取字符,注意溢出
## 拼接
string& operator+=(const string& str); // 追加到末尾
string& operator+=(const char* str); // 追加到末尾
string& operator+=(const char c); // 追加到末尾
## 查找
int find(const string& str, int pos = 0) const; // 查找str在当前字符串第一次出现的位置,pos为开始查找的位置
int find(const char* str, int pos = 0) const; // 查找str在当前字符串第一次出现的位置
int rfind(const char* str, int pos = npos) const; // 查找str在当前字符串第一次出现的位置,反向查询
string::npos 在值上等于-1 即size_t的最大值 表示直到字符串结束
## 替换
string& replace(int pos, int n, const string& str); // 从pos开始替换n个字符
string& replace(int pos, int n, const char* str); // 从pos开始替换n个字符
## 比较
int compare(const string& str) const; //根据字典序
int compare(const char* str) const; //根据字典序
各种比较操作符都有重载
## 子串
string substr(int pos = 0, int n = npos) const; //返回从pos开始,长度为n的子串
## 插入
string& insert(int pos, const char* str); //在pos位置插入
string& insert(int pos, const string& str); //在pos位置插入
string& insert(int pos, int n, char c); //在pos位置插入
## 删除
string& erase(int pos, int n = npos); //在pos位置插入
# 两种转换
string str1;
const char* str2 = str1.c_str();
const char* str3;
string str4(str3);
# 神奇转换函数
string to_ strinf(任何类型); //将好多类型转换成string

View File

@ -0,0 +1,34 @@
abs(x); //求x的绝对值 e.g.abs(-5)=5
fabs() //实数绝对值
a=clock();测量从程序开始到目前的时间并把值给a。单位毫秒级
exp(x); //求x的自然指数e^x e.g.exp(1)=2.718282
floor(x); //向下取整
ceil(x); //向上取整
log(x); //求实数x的自然数对数 e.g.log(1)=0
pow(x,y); //计算x^y,输出为双精度实数 e.g.pow(2,3)=8
sqrt(x); //求x的平方根 e.g.sqrt(25)=5
str.length();获取字符串长度(只能用在字符串string b="123456789"//字符串定义 初始化。
str.size();
strlen(str);获取字符数组长度(只能用在字符数组)。
abort() //终止程序运行 不能结束工作
exit() //终止程序运行 做结束工作
max(a,b) //两数中最大
min(a,b) //两数中最小
swap(a,b) //交换两个类型相同的变量
sort(数组名+起始单元,数组名+结束单元排序方法cmp倒)
sort(a,a+n);//sort默认为升序
int cmp(int a,int b)
{
return a>b;
}
Sleep(s时间);//程序运行到此处时暂停s毫秒注意大小写需调用头文件#include<windows.h>
void color(const unsigned short textColor) //颜色字函数
{
if(textColor>=0&&textColor<=15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),textColor);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7);
}

276
c++/windows/Key.txt Normal file
View File

@ -0,0 +1,276 @@
C++ 获取鼠标点击位置
1.检测鼠标点击事件
GetAsyncKeyState函数可以检测按键点击事件
这里是它的函数原型:
SHORT_stdcall GetAsyncKeyState(int vKey);
我们首先要根据这个函数定义一个宏KEY_DOWN这样可以方便以后的调用
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
常量名 对应按键 取值
—————————————————————————————————————————————————————————
VK_LBUTTON 鼠标左键 0x01
VK_RBUTTON 鼠标右键 0x02
VK_CANCEL Ctrl + Break 0x03
VK_MBUTTON 鼠标中键 0x04
VK_BACK Backspace 键 0x08
VK_TAB Tab 键 0x09
VK_RETURN 回车键 0x0D
VK_SHIFT Shift 键 0x10
VK_CONTROL Ctrl 键 0x11
VK_MENU Alt 键 0x12
VK_PAUSE Pause 键 0x13
VK_CAPITAL Caps Lock 键 0x14
VK_ESCAPE Esc 键 0x1B
VK_SPACE 空格键 0x20
VK_PRIOR Page Up 键 0x21
VK_NEXT Page Down 键 0x22
VK_END End 键 0x23
VK_HOME Home 键 0x24
VK_LEFT 左箭头键 0x25
VK_UP 上箭头键 0x26
VK_RIGHT 右箭头键 0x27
VK_DOWN 下箭头键 0x28
VK_SNAPSHOT Print Screen 键 0x2C
VK_Insert Insert 键 0x2D
VK_Delete Delete 键 0x2E
'0' '9' 数字 0 - 9 0x30 - 0x39
'A' 'Z' 字母 A - Z 0x41 - 0x5A
VK_LWIN 左WinKey(104键盘才有) 0x5B
VK_RWIN 右WinKey(104键盘才有) 0x5C
VK_APPS AppsKey(104键盘才有) 0x5D
VK_NUMPAD0 小键盘 0 键 0x60
VK_NUMPAD1 小键盘 1 键 0x61
VK_NUMPAD2 小键盘 2 键 0x62
VK_NUMPAD3 小键盘 3 键 0x63
VK_NUMPAD4 小键盘 4 键 0x64
VK_NUMPAD5 小键盘 5 键 0x65
VK_NUMPAD6 小键盘 6 键 0x66
VK_NUMPAD7 小键盘 7 键 0x67
VK_NUMPAD8 小键盘 8 键 0x68
VK_NUMPAD9 小键盘 9 键 0x69
VK_F1 - VK_F24 功能键F1 F24 0x70 - 0x87
VK_NUMLOCK Num Lock 键 0x90
VK_SCROLL Scroll Lock 键 0x91
这个函数可以用来检测鼠标左键的按下,我们就需要这个,先来测试一下效果
#include <windows.h> //GetAsyncKeyState所需头文件
#include <iostream>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //用来检测按键的点击事件
int main() {
//----------移除快速编辑模式(对于win10用户)----------
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
//----------循环检测----------
while(1) { //循环检测
if(KEY_DOWN(VK_LBUTTON)) { //鼠标左键按下
printf("key down!\n");
}
Sleep(20); //等待20毫秒减少CPU占用
}
return 0;
}
可以看到每次我们点击鼠标左键都会输出key down!这就说明我们的程序成功了。当然,如果你对其他的按键检测感兴趣,你也可以试试其他的。
那么接下来接下来就是获取鼠标点击时的位置了。
2.获取鼠标位置
那么如何获取鼠标的位置呢C++为我们提供了GetCursorPos这个函数它可以用来获取鼠标在屏幕上的位置。这个函数需要提供一个POINT类型的地址像下面这样
POINT p;
GetCursorPos(&p);
POINT类型包含int x和int y两个变量通过GetCursorPos函数就可以获取鼠标的位置代码很简单先来看一下效果
#include <windows.h> //所需头文件
#include <iostream>
POINT p;
int main() {
//----------循环检测----------
while(1) {
GetCursorPos(&p); //获取鼠标在屏幕上的位置
printf("(%d,%d)\n",p.x,p.y);
Sleep(20); //等待20毫秒减少CPU占用
}
return 0;
}
现在我们已经完成了已经完成了第二步,然后我们就要获取鼠标点击位置了。
3.获取鼠标点击位置
这个也是分简单,我们只需要把刚才的两段代码合起来就行了。
#include <windows.h> //GetAsyncKeyState所需头文件
#include <iostream>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //用来检测按键的点击事件
POINT p;
int main() {
//----------移除快速编辑模式(对于win10用户)----------
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
//----------循环检测----------
while(1) { //循环检测
if(KEY_DOWN(VK_LBUTTON)) { //鼠标左键按下
GetCursorPos(&p); //获取鼠标在屏幕上的位置
printf("key down (%d,%d)\n",p.x,p.y);
}
Sleep(100); //等待100毫秒减少CPU占用
}
return 0;
}
现在的程序已经基本上完成了 ,但是聪明的你可能会发现,这些坐标都是整个屏幕上的,如果我只想获取鼠标在该窗口上的位置呢?
这其实很简单C++也为我们提供了这样一个函数ScreenToClient它用来获取鼠标在指定窗口上的位置其使用方法与之前的差不多
POINT p;
GetCursorPos(&p);
ScreenToClient(h,&p);
在使用该函数之前,我们要先获取一下控制台窗口的句柄,用它来指定窗口;
HWND h=GetForegroundWindow();
其中GetForegroundWindow函数用来获取最顶层窗口的句柄这很适合我们的程序。
那么就先上代码吧!
#include <windows.h> //GetAsyncKeyState所需头文件
#include <iostream>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //用来检测按键的点击事件
POINT p;
HWND h=GetForegroundWindow();
int main() {
//----------移除快速编辑模式(对于win10用户)----------
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
//----------循环检测----------
while(1) { //循环检测
if(KEY_DOWN(VK_LBUTTON)) { //鼠标左键按下
POINT p;
GetCursorPos(&p);
ScreenToClient(h,&p); //获取鼠标在窗口上的位置
printf("key down (%d,%d)\n",p.x,p.y);
}
Sleep(100); //等待100毫秒减少CPU占用
}
return 0;
}
现在输出的就是鼠标在控制台窗口上的位置了,但是如果需要像获取光标位置一样得到鼠标位置对应的控制台窗口上输出的坐标该怎样办呢?
首先我们要获取控制台字体的高和宽,像下面这样:
HANDLE hOutput;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_FONT_INFO consoleCurrentFont;
GetCurrentConsoleFont(hOutput, FALSE, &consoleCurrentFont);
GetStdHandle(STD_OUTPUT_HANDLE)用来获取窗口的输出句柄将它储存到hOutput内,consoleCurrentFont用来储存字体的信息,用GetCurrentConsoleFont函数可以获取当前控制台的字体信息。获取字体的高和宽就像下面这样
consoleCurrentFont.dwFontSize.X //宽
consoleCurrentFont.dwFontSize.Y //高
然后用鼠标的位置除以这两个之就行了,话不多说,先上代码。
成品
#include <windows.h> //GetAsyncKeyState所需头文件
#include <iostream>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //用来检测按键的点击事件
POINT p;
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HWND h=GetForegroundWindow();
CONSOLE_FONT_INFO consoleCurrentFont;
int main() {
//----------移除快速编辑模式(对于win10用户)----------
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
//----------循环检测----------
while(1) { //循环检测
if(KEY_DOWN(VK_LBUTTON)) { //鼠标左键按下
POINT p;
GetCursorPos(&p);
ScreenToClient(h,&p); //获取鼠标在窗口上的位置
GetCurrentConsoleFont(hOutput, FALSE, &consoleCurrentFont); //获取字体信息
int x=p.x/=consoleCurrentFont.dwFontSize.X;
int y=p.y/=consoleCurrentFont.dwFontSize.Y;
printf("key down (%d,%d)\n",x,y);
}
Sleep(100); //等待100毫秒减少CPU占用
}
return 0;
}
4.1 实例:鼠标控制绘图
在写这个程序之前,我们先来了解一下几个函数:
void gotoxy(int x, int y) {
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
这个函数用来移动光标来输出。
void HideTheCursor() {
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
cciCursor.bVisible = FALSE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
#include <windows.h> //GetAsyncKeyState所需头文件
#include <iostream>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) //用来检测按键的点击事件
POINT p;
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HWND h=GetForegroundWindow();
CONSOLE_FONT_INFO consoleCurrentFont;
//----------移动光标----------
void gotoxy(int x, int y) {
COORD pos = {x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);// 获取标准输出设备句柄
SetConsoleCursorPosition(hOut, pos);//两个参数分别是指定哪个窗体,具体位置
}
//----------隐藏光标----------
void HideTheCursor() {
CONSOLE_CURSOR_INFO cciCursor;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {
cciCursor.bVisible = FALSE;
SetConsoleCursorInfo(hStdOut, &cciCursor);
}
}
int main() {
HideTheCursor(); //隐藏光标
//----------移除快速编辑模式(对于win10用户)----------
HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
DWORD mode;
GetConsoleMode(hStdin, &mode);
mode &= ~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin, mode);
//----------循环检测----------
while(1) { //循环检测
if(KEY_DOWN(VK_LBUTTON)) { //鼠标左键按下
POINT p;
GetCursorPos(&p);
ScreenToClient(h,&p); //获取鼠标在窗口上的位置
GetCurrentConsoleFont(hOutput, FALSE, &consoleCurrentFont); //获取字体信息
int x=p.x/=consoleCurrentFont.dwFontSize.X;
int y=p.y/=consoleCurrentFont.dwFontSize.Y;
gotoxy(x,y); //移动光标置鼠标位置
printf("@"); //在鼠标位置输出
}
Sleep(10); //延时
}
return 0;
}

View File

@ -0,0 +1,35 @@
continue; //跳过下面的步骤,开始下一次循环。
system("color 04");//调用#include <windows.h>头文件
/*
0=黑色 8=灰色
1=蓝色 9=淡蓝色
2=绿色 A=淡绿色
3=浅绿色 B=淡浅绿色
4=红色 C=淡红色
5=紫色 D=淡紫色
6=黄色 E=淡黄色
7=白色 F=亮白色
*/
system("mode con cols=30 lines=20");//调整显示框大小 cols:宽 lines:长
system("pause");//冻结屏幕:暂停。
system("mkdir F:\\hello");//在F盘创建一个名为hello的文件。C盘默认为桌面。
//桌面地址C:\Users\Administrator\desktop
system("title yourname");//设置程序名
a=clock();测量从程序开始到目前的时间并把值给a。单位毫秒级
#include <windows.h> //把光标移动到指定坐标
#include <time.h>
void GoToxy(int x,int y) //光标移动函数X表示横坐标Y表示纵坐标。
{
COORD coord; //使用头文件自带的坐标结构
coord.X=x; //这里将int类型值传给short,不过程序中涉及的坐标值均不会超过short范围
coord.Y=y;
HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出句柄
SetConsoleCursorPosition(a,coord); //以标准输出的句柄为参数设置控制台光标坐标
}

6
c++/windows/句柄.txt Normal file
View File

@ -0,0 +1,6 @@
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)//判断这个键是否按下
#define KEY_UP(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 0 : 1)//判断这个键是否弹起
#define KEY_EVERY(lpkeyState) GetKeyboardState(lpKeyState)//获得所有的256个键键盘按键、鼠标按键等等的状态lpKeyState是指向一个256bit的数组存放所有键的状态。
#define KEY_NOW(nVirtKey) GetKeyState(nVirtKey)//用于判断nVirtKey的状态。用返回值的最高位表示最高位为1表示当前键处于down的状态最高位为0当前键处于up状态。此函数从消息队列中读取消息进行处理。
#define setcolor(x) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x)//设置颜色
#define GetWindow() GetForegroundWindow();//得到窗口信息

Binary file not shown.

After

Width:  |  Height:  |  Size: 414 KiB

117
linux/file/.bashrc Normal file
View File

@ -0,0 +1,117 @@
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
# don't put duplicate lines or lines starting with space in the history.
# See bash(1) for more options
HISTCONTROL=ignoreboth
# append to the history file, don't overwrite it
shopt -s histappend
# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=500
HISTFILESIZE=500
# check the window size after each command and, if necessary,
# update the values of LINES and COLUMNS.
shopt -s checkwinsize
# If set, the pattern "**" used in a pathname expansion context will
# match all files and zero or more directories and subdirectories.
#shopt -s globstar
# make less more friendly for non-text input files, see lesspipe(1)
[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)"
# set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
xterm-color|*-256color) color_prompt=yes;;
esac
# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes
if [ -n "$force_color_prompt" ]; then
if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
# We have color support; assume it's compliant with Ecma-48
# (ISO/IEC-6429). (Lack of such support is extremely rare, and such
# a case would tend to support setf rather than setaf.)
color_prompt=yes
else
color_prompt=
fi
fi
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h@\t\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
PS1='${debian_chroot:+($debian_chroot)}\u@\h@\t:\w\$ '
fi
unset color_prompt force_color_prompt
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h@\t: \w\a\]$PS1"
;;
*)
;;
esac
# enable color support of ls and also add handy aliases
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
#alias dir='dir --color=auto'
#alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi
# colored GCC warnings and errors
#export GCC_COLORS='error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01'
# some more ls aliases
alias ll='ls -ahlF'
alias l='ls -lF'
# Add an "alert" alias for long running commands. Use like so:
# sleep 10; alert
alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.
if [ -f ~/.bash_aliases ]; then
. ~/.bash_aliases
fi
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
alias powerele="upower -i /org/freedesktop/UPower/devices/battery_BAT0"
export LANG=en_US.UTF-8

27
linux/file/.profile Normal file
View File

@ -0,0 +1,27 @@
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
#umask 022
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
PATH="$HOME/.local/bin:$PATH"
fi

30
linux/file/.vimrc Normal file
View File

@ -0,0 +1,30 @@
syntax on
set number "显示行号
set ts=4
"set expandtab "tab to space
set autoindent "自动缩进
set encoding=utf-8 "使用utf-8字符编码
set fileencoding=utf-8
"set cindent
set nocompatible "?
"set guifont=consolas:h14
set wrap "自动折行
set cursorline "光标行高亮
set hlsearch "高亮显示搜索结果
set incsearch "搜索模式下,每输入一个字符,就跳到对应结果
set ignorecase "忽略搜索大小写
nnoremap <space>b :buffers<cr>:b<space>
nnoremap <space>e :b#<cr>
nnoremap <space>s :split<space>
nnoremap <space>w :w<cr>
nnoremap qw :wq<cr>
nnoremap qq :q<cr>
nnoremap <space>tt :tabedit<space>
nnoremap <space>to :tabonly<cr>
nnoremap <space>tc :tabclose<cr>
inoremap jf <esc>
inoremap jq <esc>:wq<cr>
inoremap jw <c-x><c-n>
inoremap jl <c-x><c-l>
cnoremap jf <c-c>

14
linux/file/backup_etc.sh Normal file
View File

@ -0,0 +1,14 @@
#!/bin/bash
#
PATH=/bin:/sbin:/usr/local/bin
export PATH
read -p "Please input (in/out)" cz
if [ ${cz} == "in" ]; then
cp -v ~/.profile ~/.bashrc ~/.vimrc ./
cp -rv ~/.ssh ./
fi
if [ ${cz} == "out" ]; then
cp -iv ./.profile ./.bashrc ./.vimrc ~/
fi

37
linux/file/issue Normal file
View File

@ -0,0 +1,37 @@
Ubuntu 20.04.6 LTS \n \l
@@@@@@@@@@@@@@@@@ @@@ @@@@ @@ @@ @@
@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@ @@ @@
@@@@ @@@ @@@ @@ @@ @@
@@@ @@@ @@ @@@@@@@@@@@@ @@ @@
@@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@ @@ @@ @@ @@@@
@@@ @@ @@ @@ @@ @@ @@ @@ @@@@
@@@@ @@ @@ @@@@ @@@@ @@@ @@ @@
@@@@ @@ @@@@@@@@@@@@@@@@ @@@@ @@ @@@ @@ @@@
@@@@ @@@@ @@ @@ @@ @@@ @@ @@ @@@@ @@ @@
@@@ @@@@@ @@ @@ @@ @@@@ @@ @@ @@ @@
@@@ @@@@@@@@@@@@@@@@ @@ @@ @@ @@@
@@@ @@ @@ @@ @@ @@ @@ @@@
@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ @ @@ @@ @@@ @@@@@
@@@ @@ @@@ @@ @@@ @@@@@@@@
@@ @@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ aa
@@@ @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@
@@ @@ @@@ @@@
@ @@@@@@@@@@@@@@@@@ @@ @@ @@ @@@ @@@
@@@@@@@@@@@@@@@@ @@@@ @@ @@ @@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@
@@@ @@@ @@@@@@@@@ @@ @@@@@@@@@@@@@@@@@@@@@ @@@@ @@ @@@
@@ @@@@@@@@@@@ @@@ @@ @@ @@ @@@ @@@ @@ @@@ @@@ @@ @@@
@@ @@ @@ @@@ @@ @@ @@ @@@ @@ @@ @@@ @@@ @@@
@@ @@ @@ @@@ @@ @@ @@ @@ @@ @@ @@ @@ @@@ @@@@@@@@@@@@@@@@
@@ @@@@@@@@ @@ @@@ @@@@ @@ @ @@ @@ @@ @@@ @@@
@@ @@ @@@ @@ @@ @@ @@ @@ @@@ @@@
@@ @@@ @@ @@ @ @@ @@ @@ @@@ @@@
@@ @@ @@@ @@@ @@@ @@ @@ @@ @@@ @@@ @v
@@@@ @@@ @@@@@@@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@o

14
linux/format.sh Normal file
View File

@ -0,0 +1,14 @@
# Copyright(c) 2024 ely. All rights reserved.
#
# Name: format.sh v1.0
#
# Program:
# Shell Script format
#
# History:
# 2024/07/24 e0x1a new commit
#
# AUTHOR:
# e0x1a "e0x1a@aliyun.com"
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

11
linux/q_a/Huge_Page Normal file
View File

@ -0,0 +1,11 @@
内存默认分页 2MB
Linux对Huge_Page的支持可以带来的好处:
1.大大减少Page Fault的次数
2.降低TLB Miss的概率
3.增加MMU地址转换的效率
4.Page可以永驻内存避免被swap
cat /proc/meminfo | grep Huge //查看Huge相关内容
cat /proc/sys/vm/nr_hugepages //确认分配的数量
echo 1024 > /proc/sys/vm/nr_hugepages //分配huge

71
linux/q_a/command Normal file
View File

@ -0,0 +1,71 @@
#1
nohup 命令挂机(退出登陆后依然执行)
nohup [command] &
#2 screen
`screen` 是一个功能强大的命令行工具,主要用于 Unix 和类 Unix 操作系统中,它允许用户开启多个独立的会话(称为"窗口"),在这些会话之间可以自由切换而不会中断已经运行的程序。以下是 `screen` 的一些主要功能和使用方法:
### 主要功能:
1. **多会话管理**:可以同时运行多个独立的 shell 会话。
2. **会话分离与重连**:可以从一个会话中分离出来,稍后再重新连接到该会话。
3. **窗口分割**:在一个 screen 会话中,可以水平或垂直分割窗口,以同时查看和操作多个任务。
4. **滚动记录**:可以查看会话的滚动记录,即使之前的输出已经滚出屏幕。
5. **复制和粘贴**:在 screen 会话中,可以使用快捷键复制文本并粘贴到其他位置。
6. **会话锁定**:可以锁定当前会话,防止他人查看或操作。
7. **自动保存会话**在网络断开或其他异常情况下screen 可以自动保存当前会话状态。
### 基本使用方法:
1. **启动一个新的 screen 会话**
```bash
screen
```
2. **列出当前的 screen 会话**
```bash
screen -ls
```
3. **重新连接到一个已存在的会话**
```bash
screen -r [会话ID或名称]
```
4. **分离当前会话**
在 screen 会话中按 `Ctrl-a` 然后按 `d`。
5. **在会话中创建新窗口**
在 screen 会话中按 `Ctrl-a` 然后按 `c`。
6. **在窗口之间切换**
在 screen 会话中按 `Ctrl-a` 然后按 `n`(下一个窗口)或 `Ctrl-a` 然后按 `p`(上一个窗口)。
7. **分割窗口**
- 水平分割:在 screen 会话中按 `Ctrl-a` 然后按 `"`(双引号键)。
- 垂直分割:在 screen 会话中按 `Ctrl-a` 然后按 `S`。
8. **调整分割窗口的大小**
- 增加/减少水平大小:在 screen 会话中按 `Ctrl-a` 然后按方向键。
- 增加/减少垂直大小:在 screen 会话中按 `Ctrl-a` 然后按 `Shift` 加上方向键。
9. **退出 screen 会话**
- 关闭当前窗口:在 screen 会话中按 `Ctrl-a` 然后按 `k`。
- 退出所有窗口并结束会话:在 screen 会话中按 `Ctrl-a` 然后按 `\`。
10. **锁定当前会话**
在 screen 会话中按 `Ctrl-a` 然后按 `x`。
#3 smartctl
查看硬盘状态参数
-a 全部参数
-H 是否正常
#4 perf
性能剖析工具
可分析程序运行期间发生的系统硬件事件
sudo perf record ./a.out
sudo perf report -i perf.data
#5 ulimit
查看和修改进程运行资源限制
-H/S # 设置/显示 软/硬 限制
-a # 显示所有
-t # cpu time
-f # file size
-s # stack size
-c # core file size
-m # memory size
-l # lock memory size
-p # user processes
-n # open file
#ulimit -Ht 3600

39
linux/q_a/newPC.txt Normal file
View File

@ -0,0 +1,39 @@
1.配置dhcp
vim /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
#iface eth0 inet static
#address 192.168.0.108
#netmask 255.255.255.0
#gateway 192.168.0.101
#network 192.168.0.108
service network restart //cpwl
2.配置dns
vim /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
search localdomain
3.更新应用
apt update
apt upgrade
4.安装配置ibus
apt install ibus
apt install ibus-pinyin
ibus-setup
5.安装gcc,g++,gdb,cmake
apt update
apt install build-essential gdb
gcc --version
g++ --version
gdb --version
apt intall cmake
cmake --version
6.安装各工具
tree
dnsmap
nload

23
linux/q_a/proc Normal file
View File

@ -0,0 +1,23 @@
`/proc` 是 Linux 系统中的一个虚拟文件系统它提供了一种查看和控制正在运行的进程的方式。这个文件系统包含了多个目录目录名对应于系统中的每个进程的进程IDPID。每个进程的目录中包含了一些文件这些文件包含了有关进程的各种信息。以下是一些常见的 `/proc` 目录下的文件及其解释:
1. **cmdline**: 包含启动进程的完整命令行参数。
2. **cwd**: 一个符号链接,指向进程的当前工作目录。
3. **environ**: 包含进程的环境变量。
4. **exe**: 一个符号链接,指向启动该进程的可执行文件。
5. **fd**: 包含该进程打开的文件描述符的目录,每个文件描述符都有一个对应的文件。
6. **gid_map**: 显示进程的组ID映射。
7. **maps**: 显示进程的内存映射,包括代码段、数据段、堆栈等。
8. **mem**: 包含进程使用的内存信息。
9. **mounts**: 显示进程的挂载点。
10. **mountinfo**: 包含更详细的挂载点信息。
11. **numa_maps**: 显示进程的NUMA非统一内存访问配置。
12. **oom_adj**: 进程的OOM内存不足调整值用于确定哪个进程在内存不足时被杀死。
13. **osrelease**: 包含操作系统的版本信息。
14. **pid**: 进程的PID这是一个符号链接指向 `/proc/self`。
15. **stat**: 包含进程的状态信息如进程ID、父进程ID、CPU时间等。
16. **status**: 包含更详细的进程状态信息,如进程的名称、状态、信号等。
17. **task**: 包含进程的线程信息。
18. **uid_map**: 显示进程的用户ID映射。
19. **wchan**: 显示进程正在等待的系统调用。
可以通过读取这些文件来获取进程的详细信息。例如,使用 `cat /proc/[pid]/status` 可以查看特定进程的状态信息。这些信息对于系统管理员和开发者来说是非常有用的,可以帮助他们监控和调试系统。

View File

@ -0,0 +1,26 @@
VmSize: 虚拟内存总大小。 整个进程使用虚拟内存大小是VmLib, VmExe, VmData, 和 VmStk的总和。占所有虚拟内存分配文件映射共享内存堆内存任何内存的份额。
VmLck: 虚拟内存锁。进程当前使用的并且加锁的虚拟内存总数.锁住的物理内存不能交换到硬盘.
VmRSS: 虚拟内存驻留集合大小。这是驻留在物理内存的一部分。它没有交换到硬盘。它包括代码,数据和栈。
VmData: 虚拟内存数据。堆使用的虚拟内存。表示进程数据段的大小.
VmStk: 虚拟内存栈。表示进程堆栈段的大小.
VmLib: 虚拟内存库,动态链接库所使用的虚拟内存 表示进程所使用LIB库的大小.
VmPeak代表当前进程运行过程中占用内存的峰值.
VmHWM是程序得到分配到物理内存的峰值.
VmRSS是程序现在使用的物理内存.
VmExe:表示进程代码的大小.可执行的虚拟内存,可执行的和静态链接库所使用的虚拟内存
VmPTE:占用的页表的大小.
VmSwap:进程占用Swap的大小.
Threads:表示当前进程组的线程数量.
SigPnd:屏蔽位,存储了该线程的待处理信号,等同于线程的PENDING信号.
ShnPnd:屏蔽位,存储了该线程组的待处理信号.等同于进程组的PENDING信号.
SigBlk:存放被阻塞的信号,等同于BLOCKED信号.
SigIgn:存放被忽略的信号,等同于IGNORED信号.
SigCgt:存放捕获的信号,等同于CAUGHT信号.
CapEff:当一个进程要进行某个特权操作时,操作系统会检查cap_effective的对应位是否有效,而不再是检查进程的有效UID是否为0.
CapPrm:表示进程能够使用的能力,在cap_permitted中可以包含cap_effective中没有的能力这些能力是被进程自己临时放弃的,也可以说cap_effective是cap_permitted的一个子集.
CapInh:表示能够被当前进程执行的程序继承的能力.
CapBnd:是系统的边界能力,我们无法改变它.
Cpus_allowed:3指出该进程可以使用CPU的亲和性掩码,因为我们指定为两块CPU,所以这里就是3,如果该进程指定为4个CPU(如果有话),这里就是F(1111).
Cpus_allowed_list:0-1指出该进程可以使用CPU的列表,这里是0-1.
voluntary_ctxt_switches表示进程主动切换的次数.
nonvoluntary_ctxt_switches表示进程被动切换的次数.

41
pc/usb Normal file
View File

@ -0,0 +1,41 @@
USB 1.0分为两个版本:
USB 1.0 Low Speed理论最高速率为1.5Mbit/s或0.1875MBytes/s。
USB 1.0 Full Speed理论最高速率为12Mbit/s或1.5MBytes/s。
USB 1.1即USB 1.0 Full Speed理论最高速率为12Mbit/s或1.5MBytes/s。
USB 2.0分为两个版本:
USB 2.0 Full Speed即USB 1.1理论最高速率为12Mbit/s或1.5MBytes/s。
USB 2.0 Hi Speed理论最高速率为480Mbit/s或60MBytes/s。
USB 3.0的理论最高速率为5Gbit/s或600MBytes/s。
USB 3.1分为两个版本:
USB 3.1 Gen 1即USB 3.0理论最高速率为5Gbit/s或600MBytes/s。
USB 3.1 Gen 2理论最高速率为10Gbit/s或1250MBytes/s。
USB 3.2分为三个版本:
USB 3.2 Gen 1即USB 3.1 Gen 1理论最高速率为5Gbit/s或600MBytes/s。
USB 3.2 Gen 2即USB 3.1 Gen 2理论最高速率为10Gbit/s或1250MBytes/s。
USB 3.2 Gen 2×2即USB 3.1 Gen 2双通道仅限Type-C接口理论最高速率为20Gbit/s或2500MBytes/s。
USB 4分为两个版本
USB 4 v1.0仅限Type-C接口的理论最高速率为40Gbit/s或5000MBytes/s。
USB 4 v2.0仅限Type-C接口的理论最高速率为80Gbit/s或10000MBytes/s。
雷电Thunderbolt分为五个版本
雷电1代Thunderbolt 1理论最高速率为10Gbit/s或1250MBytes/s。
雷电2代Thunderbolt 2理论最高速率为20Gbit/s或2500MBytes/s。
雷电3代Thunderbolt 3理论最高速率为40Gbit/s或5000MBytes/s。
雷电4代Thunderbolt 4理论最高速率为40Gbit/s或5000MBytes/s。
雷电5代Thunderbolt 5理论最高速率为80Gbit/s或10000MBytes/s。
注意:实际传输速度取决于很多方面,而且很难达到理论速度。
1、单位换算1Byte=8bit。
2、软件方面要求必须正确安装相关驱动。
3、硬件要求连接的双方都必须支持同种版本的USB或雷电Thunderbolt接口若不同传输速度则以速度低的一方为基准。
4、即使连接的双方USB或雷电Thunderbolt接口版本相同不同的存储介质其速度也不一样。
5、基于闪存Flash芯片存储设备的速度取决于Flash芯片的类型SLC/MLC/TLC/QLC和等级、主控芯片、缓存等因素。普通机械硬盘的读写速度取决于盘片的数量、转速和缓存等因素。
6、USB接口有多种颜色黑色USB接口是USB2.0接口蓝色USB接口是USB3.0接口USB 3.1 Gen 1青绿色和红色USB接口是USB 3.1 Gen 2接口黄色USB接口是支持关机充电的USB2.0接口叫做Powered USB。
7、USB接口的外形有Type-A常见于电脑、Type-B常见于打印机、Type-C常见于新型号电脑和手机和Mini USBMini-B接口常见于扫描仪、Micro USBMicro-B接口常见于安卓手机等。

BIN
pc/usb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 KiB

BIN
pc/usb2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 KiB

BIN
pc/usb3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 478 KiB

20
tool/curl/aaa Normal file
View File

@ -0,0 +1,20 @@
curl [URL] #默认GET请求
curl -X -POST [URL] #POST请求
== curl -XPOST [URL]
curl [URL] -d 'data' #添加数据
curl -XPUT [URL] -d 'data_new' #更新数据
curl -XDELETE [URL] #删除数据
curl -I [URL] #返回首部
curl -O [URL] #下载资源
-o [name] #自定义文件名
curl --limit-rate [速度] -o [name] -O [URL] #限速下载
curl -C - -o [name] [URL] #中断下载后继续
curl [...] -L #跟随重定向
curl -v [...] #显示底层连接信息

33
tool/docker/aaa Normal file
View File

@ -0,0 +1,33 @@
安装docker
sudo apt-get install docker-compose
配置/etc/docker/daemon.json
{
"registry-mirrors":
[
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
docker ps #查看所有运行容器
docker ps -a #全部
docker stop [ID / NAME] #停止某容器
docker start [ID / NAME] #启动和删除容器
docker rm [ID / NAME]
docker pull 仓库名/镜像名
docker save [ID] > xxx.tar #导出为tar文件
docker load < xxx.tar #导入tar为镜像
docker commit [ID] [镜像名] #容器保存为镜像
docker image ls #查看本地所有镜像
docker rmi [ID / NAME] #删除镜像
docker exec -it [ID / NAME] bash #操作容器

156
tool/git/aaa Normal file
View File

@ -0,0 +1,156 @@
git config --global credential.helper store
/\ /\ user.name " "
|| || user.email " "
配置git环境 配置整个环境
工作树 -- 暂存区 -- 本地仓库 -- 远端仓库
git status #查看当前仓库状态
git init #创建仓库
--bare <code.git> #没有工作树的选项(多用于git服务器)
git add 文件 #将文件放到暂存区
* #所有 新建的,删除的,修改的
. #新建的,修改的
-u #删除的,修改的
git commit #将暂存区修改合成一个提交
-m "填写概要"
# 不写概要则会创建一个文件,第一行概要,第二行空,第三行详细
-am #相当于add + commit
git log #仓库日志
-a #查看所有分支的提交记录
--stat #详细
--pretty=[short/oneline] #特殊显示
--graph #更直观选项
--after="YYYY-MM-DD" #指定日期
--before="YYYY-MM-DD" #指定日期
--author="xxx" #特点作者提交
origin/master #看远端仓库的日志
文件/目录 #单独追踪
git diff #比对差异 与暂存区差异
HEAD #与本地仓库最新提交差异
git reflog #查询历史操作
git branch #显示所有分支
xxx #创建名为 xxx 的分支
-a #查看当前工作分支相关信息
-r #列出远端仓库的所有分支
-d/D #删除分支 大写强制
-m/M #修改主分支 大写强制
git checkout #切换分支
xxx #切换到 xxx 分支
-b xxx #创建并切换到 xxx 分支
[file] #未提交的文件撤销修改
[hash] #回退
git merge #合并分支
xxx #将 xxx 分支合并到当前工作分支
--no-ff #在历史记录中记录合并
--squash #将分支合并为一个提交进行合并,简化历史
git reset #回溯
--hard HEAD~1 #撤销最后一次commit 本地仓库 and 暂存区 and 工作树
HEAD~1 #撤销最后一次commit 仅本地仓库 and 暂存区
--soft HEAD~1 #撤销最后一次commit 仅本地仓库
git revert #提交一个反commit用于撤销前面的commit
HEAD
[hash]
git rebase #变基
-i #压缩历史
xxx #尝试与xxx分支同步合并
--abort #当冲突时撤销合并
--continue #继续合并
git switch #
-c xxx #创建并切换到 xxx 分支
git stash #保存工作区当前状态
list #查看存储状态
pop #将最新一次记录恢复并删除
apply #默认恢复最新记录
clear #清楚所有记录
show #看当前与栈顶差异
save xxx #提交注释
-----------------------------------------------------------------------------
git clone URL #clone一个仓库
git remote #操作远程仓库
add origin URL #添加远程仓库
rm origin URL #删除远程仓库
-v #显示详细信息
git push #推送到远程
origin xxx:xxx #将 xxx 分支推送到远端 origin 仓库 本地分支:远端分支
-u origin xxx #推送同时尝试将origin 的 xxx 设置为上游
origin xxx --delete #删除远端的xxx分支
--tags #推送全部标签
-f #强制提交
origin :xxx #删除远端 xxx 分支
git pull #拉取远端仓库 全部 = git fetch + git merge
origin xxx #直接覆盖当前工作树
--rebase # = git fetch + git rebase HEAD
git fetch #拉取到本地仓库中 不对工作树进行覆盖
git tag #查看所有标签
-d #删除标签
[tag] #
-a #设置标签名
-m #填写标签说明
-----------------------------------------------------------------------------
.gitignore #此文件中可放置不想追踪的文件
#1:
修改了ssh端口的推送与clone
git remote add iaalai ssh://root@api.iaalai.cn:25522/root/git/code.git/
git clone ssh://root@api.iaalai.cn:25522/root/git/code.git/
#2:
搭建git服务器
1 + install git/openssh
2 + useradd git
3 + 创建证书登陆
用户: .ssh/id.rsa.pub -> 服务器:.ssh/authorized_keys 一行一个
4 + 创建仓库并移交权限给git用户
5 + 禁用登陆shll usermod -s /bin/git-shell git
#3:
工作流参考
1 + git clone 到本地仓库
2 + git checkout -b feature 创建新分支
3 + git commit -am 提交
4 + git push origin feature
当遇到主分支更新时
1 + git checkout main 切换到主分支
2 + git pull origin main 拉取最新更新
3 + git checkout feature 切换到特性分支
4 + git rebase main 尝试变基合并
5 + git push -f origin feature 强制提交特性分支
6 + Pull Request Squash and merge 合并到主分支
7 + git checkout main 切换回主分支
8 + git branch -D feature 删除特性分支
9 + git pull origin main 拉取最新主分支
#4:
开发时查看远端仓库是否更新
pull or fetch

15
tool/git/github Normal file
View File

@ -0,0 +1,15 @@
加速器
https://cloud.tsinghua.edu.cn/d/df482a15afb64dfeaff8/
推送到github
git remote add origin https://
git branch -M master
git push -u origin master
github访问令牌
创建:
用户头像 -> setting -> 最后一项 -> 创建令牌
tips:令牌要当场复制,离开页面就没有了
使用:
git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git

33
tool/nginx/aaa Normal file
View File

@ -0,0 +1,33 @@
nginx
-s stop #立即停止
quit #正常停止
reload #重新加载
reopen #打开日志文件
-V #看一堆参数
-t #检测配置文件是否正常
events {} #必包含
listen 80 #监听80端口
server_name e0x1a.cn #主机地址
root /var/www #指定根目录
index inext.html #指定index文件
location / {}
'=' #完全匹配
'^~' #优先前缀
'~'和'~*' #正则
' ' #普通匹配
部署
sudo apt-get update
sudo apt-get install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

36
tool/ssh/aaa Normal file
View File

@ -0,0 +1,36 @@
SSH免密登录是一种使用SSH协议进行身份验证的方法它允许用户在不输入密码的情况下登录远程服务器。以下是实现SSH免密登录的基本步骤
1. **生成密钥对**
- 在本地机器上打开终端或命令提示符。
- 使用`ssh-keygen`命令生成一对公钥和私钥。例如:
```bash
ssh-keygen -t rsa -b 4096
```
2. **复制公钥到远程服务器**
- 使用`ssh-copy-id`命令将公钥复制到远程服务器。例如:
```bash
ssh-copy-id user@remote_host
```
- 这将自动将你的公钥添加到远程服务器的`~/.ssh/authorized_keys`文件中。
3. **配置SSH客户端**
- 确保你的SSH客户端配置文件`~/.ssh/config`正确设置,以便使用私钥进行身份验证。例如:
4. **禁用密码登录**:
- /etc/ssh/sshd_config
- 设置PasswordAuthentication no
5. **测试免密登录**
- 尝试使用SSH连接到远程服务器如果一切设置正确你将能够无需输入密码直接登录。
6. **注意事项**
- 确保远程服务器的SSH服务配置允许密钥认证。通常在`/etc/ssh/sshd_config`文件中设置。
- 确保本地和远程的SSH配置文件没有错误并且权限设置正确。
7. **安全性**
- 使用强密码短语保护你的私钥文件。
- 定期更换密钥对以提高安全性。
以上步骤应该可以帮助你设置SSH免密登录。如果你遇到任何问题可以查看SSH的日志文件或使用`-v`参数进行调试,例如:
```bash
ssh -v user@remote_host
```
这将提供详细的调试信息,帮助你诊断问题。

8
tool/ssh/config Normal file
View File

@ -0,0 +1,8 @@
Host iaalai
HostName api.iaalai.cn #连接地址
User e0x1a #连接用户名
Port 20022 #连接端口
IdentityFile ~/.ssh/id_rsa #密钥地址
IdentitiesOnly yes #仅使用密钥
ServerAliveInterval 60 #每60s发一个空包保持连接
ServerAliveCountMax 3 #3次未响应断开

5
windows/Windows+R.txt Normal file
View File

@ -0,0 +1,5 @@
cmd //cmd
dxdiag //电脑配置
mrt //清理恶意软件
cleanmgr //清理磁盘
regedit //使用注册表

View File

@ -0,0 +1,2 @@
dir /s/a/b/os 此电脑\HONOR 20 PRO\内部存储*.mp4
pause

120
windows/cmd/cmd.txt Normal file
View File

@ -0,0 +1,120 @@
1.chkdsk C: /F
2.format G: //修复U盘
arp -a //arp缓存
fsutil behavior query disabledeletenotify //命令提示符查看系统有无开启TRIM回收指令
fsutil behavior set disabledeletenotify 1 //开启
fsutil behavior set disabledeletenotify 0 //关闭
start //打开应用或网站
ping //网络连接及网络连接的状况
for /l %d in (1,1,255)do ping 10.168.1%d 范围测试
tracert //显示数据包到达目的主机所经过的路径
ipconfig/all //显示当前TCP/IP配置的设置值
ipconfig /flushdns // 清空DNS缓存
nslookup //查询任何一台机器的IP和对应的域名
netstat //显示活动的TCP连接计算机侦听的端口以太网统计信息IP路由表IPv4统计信息以及IPv6统计信息
powercfg -h off //关闭休眠可节省C盘空间
-----------------------------------------------------------------------------
windows控制台命令 大集合
开始→运行→命令 集锦
winver---------检查Windows版本
wmimgmt.msc----打开windows管理体系结构(WMI)
wupdmgr--------windows更新程序
wscript--------windows脚本宿主设置
write----------写字板
winmsd---------系统信息
Msconfig.exe---系统配置实用程序
mspaint--------画图板
mstsc----------远程桌面连接
magnify--------放大镜实用程序
dxdiag---------检查DirectX信息
drwtsn32------ 系统医生
devmgmt.msc--- 设备管理器
dfrg.msc-------磁盘碎片整理程序
diskmgmt.msc---磁盘管理实用程序
notepad--------打开记事本
nslookup-------网络管理的工具向导
ntbackup-------系统备份和还原
ntmsmgr.msc----移动存储管理器
ntmsoprq.msc---移动存储管理员操作请求
netstat -an----(TC)命令检查接口
sysedit--------系统配置编辑器
sigverif-------文件签名验证程序
sndrec32-------录音机
shrpubw--------创建共享文件夹
secpol.msc-----本地安全策略
services.msc---本地服务设置
Sndvol32-------音量控制程序
sfc.exe--------系统文件检查器
taskmgr--------任务管理器
eventvwr-------事件查看器
eudcedit-------造字程序
explorer-------打开资源管理器
packager-------对象包装程序
regedit.exe----注册表
rsop.msc-------组策略结果集
regedt32-------注册表编辑器
regsvr32 /u *.dll----停止dll文件运行
regsvr32 /u zipfldr.dll------取消ZIP支持
chkdsk.exe-----Chkdsk磁盘检查
certmgr.msc----证书管理实用程序
calc-----------启动计算器
charmap--------启动字符映射表
cliconfg-------SQL SERVER 客户端网络实用程序
compmgmt.msc---计算机管理
cleanmgr-------垃圾整理
ciadv.msc------索引服务程序
osk------------打开屏幕键盘
fsmgmt.msc-----共享文件夹管理器
gpedit.msc-----组策略

2784
windows/vbs/VBS.txt Normal file

File diff suppressed because it is too large Load Diff

62
windows/vbs/nv.vbs Normal file
View File

@ -0,0 +1,62 @@
WScript.Echo("嘿,谢谢你打开我哦,我等你很久拉!"&TSName)
WScript.Echo("你是可爱的小朋吗?")
WScript.Echo("哈,我想你拉,这你都不知道吗?")
WScript.Echo("怎么才来,说~是不是不关心我")
WScript.Echo("哼,我生气拉,等你这么久,心都凉啦。")
WScript.Echo("小强很生气,后果很严重哦。")
WScript.Echo("嘿嘿!你也会很惨滴哦")
WScript.Echo("是不是想清除我?")
WScript.Echo("那你要点上50下哦不过会给你惊喜滴")
WScript.Echo("还剩49下快点点哦")
WScript.Echo("还剩48下快点小笨蛋")
WScript.Echo("还剩47下对就这样快点点")
WScript.Echo("还剩46下。你啊就是笨要快哦我先不打扰你工作。")
WScript.Echo("还剩45下记得要快哦")
WScript.Echo("还剩43下")
WScript.Echo("还剩42下")
WScript.Echo("还剩41下")
WScript.Echo("还剩40下")
WScript.Echo("还剩39下")
WScript.Echo("还剩38下")
WScript.Echo("还剩37下")
WScript.Echo("还剩36下")
WScript.Echo("还剩35下")
WScript.Echo("还剩34下")
WScript.Echo("还剩33下")
WScript.Echo("还剩32下")
WScript.Echo("还剩30下")
WScript.Echo("还剩29下")
WScript.Echo("还剩28下")
WScript.Echo("还剩27下")
WScript.Echo("还剩26下")
WScript.Echo("还剩25下")
WScript.Echo("还剩24下")
WScript.Echo("还剩23下")
WScript.Echo("还剩22下")
WScript.Echo("还剩21下")
WScript.Echo("还剩20下")
WScript.Echo("还剩19下")
WScript.Echo("还剩18下")
WScript.Echo("还剩17下")
WScript.Echo("还剩16下")
WScript.Echo("还剩15下")
WScript.Echo("还剩14下")
WScript.Echo("还剩13下停停慢点我有话要说")
WScript.Echo("还剩12下你继续点我就会消失滴")
WScript.Echo("还剩11下以后就看不到我拉。555555")
WScript.Echo("还剩10下你现在可以选择停止")
WScript.Echo("还剩9下。你还点啊不要我拉")
WScript.Echo("还剩8下有点伤心拉干嘛丢弃人家")
WScript.Echo("还剩7下。疯了你有点负意")
WScript.Echo("还剩6下。对。你就点吧我恨你")
WScript.Echo("还剩5下不明白删除我你就好吗")
WScript.Echo("还剩4下真要删除我")
WScript.Echo("还剩3下。可是我真的很眷恋你。。。")
WScript.Echo("还剩2下。不要这么绝情嘛人家是爱你的")
WScript.Echo("还剩1下。哼既然你这么绝情。也别怪我无义")
WScript.Echo("我本因该消失的,不过我留恋你滴芳容,上帝又给了一次机会。")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")

View File

@ -0,0 +1,123 @@
一、你打开好友的聊天对话框,然后记下在你QQ里好友的昵称,把下面代码里的xx替换一下,就可以自定义发送QQ信息到好友的次数(代码里的数字10改一下即可).
xx.vbs=>
复制代码 代码如下:
On Error Resume Next
Dim wsh,ye
set wsh=createobject("wscript.shell")
for i=1 to 10
wscript.sleep 700
wsh.AppActivate("与 xx 聊天中")
wsh.sendKeys "^v"
wsh.sendKeys i
wsh.sendKeys "%s"
next
wscript.quit
二、我就用这个程序放在学校图书馆查询书刊的机器上,好多人都那它没办法,哈哈
do
msgbox "You are foolish!"
loop
三、打开无数个计算器,直到死机
set wsh=createobject("wscript.shell")
do
wsh.run "calc"
loop
四、直接关机
dim WSHshell
set WSHshell = wscript.createobject("wscript.shell")
WSHshell.run "shutdown -f -s -t 00",0 ,true
五、删除D:\所有文件
dim WSHshell
set WSHshell = wscript.createobject("wscript.shell")
WSHshell.run "cmd /c ""del d:\*.* / f /q /s""",0 ,true
六、不断弹出窗口
复制代码 代码如下:
while(1)
msgbox "哈哈 你被耍了!"
loop
七、不断按下alt+f4 (开什么都关闭……)
复制代码 代码如下:
dim WSHshell
set WSHshell = wscript.createobject("wscript.shell")
while(1)
WSHshell.SendKeys "%{F4}"
loop
八、按500次回车
(以上代码在运行者的电脑上显示500个对话框。其中 do until s=500 500可以随意更改)
复制代码 代码如下:
dim s
do until s=500
s=s+1
msgbox "哥们给我按500次回车吧",64
loop
九、关不掉的窗口
复制代码 代码如下:
WScript.Echo("嘿,谢谢你打开我哦,我等你很久拉!"&TSName)
WScript.Echo("你是可爱的小朋吗?")
WScript.Echo("哈,我想你拉,这你都不知道吗?")
WScript.Echo("怎么才来,说~是不是不关心我")
WScript.Echo("哼,我生气拉,等你这么久,心都凉啦。")
WScript.Echo("小强很生气,后果很严重哦。")
WScript.Echo("嘿嘿!你也会很惨滴哦")
WScript.Echo("是不是想清除我?")
WScript.Echo("那你要点上50下哦不过会给你惊喜滴")
WScript.Echo("还剩49下快点点哦")
WScript.Echo("还剩48下快点小笨蛋")
WScript.Echo("还剩47下对就这样快点点")
WScript.Echo("还剩46下。你啊就是笨要快哦我先不打扰你工作。")
WScript.Echo("还剩45下记得要快哦")
WScript.Echo("还剩43下")
WScript.Echo("还剩42下")
WScript.Echo("还剩41下")
WScript.Echo("还剩40下")
WScript.Echo("还剩39下")
WScript.Echo("还剩38下")
WScript.Echo("还剩37下")
WScript.Echo("还剩36下")
WScript.Echo("还剩35下")
WScript.Echo("还剩34下")
WScript.Echo("还剩33下")
WScript.Echo("还剩32下")
WScript.Echo("还剩30下")
WScript.Echo("还剩29下")
WScript.Echo("还剩28下")
WScript.Echo("还剩27下")
WScript.Echo("还剩26下")
WScript.Echo("还剩25下")
WScript.Echo("还剩24下")
WScript.Echo("还剩23下")
WScript.Echo("还剩22下")
WScript.Echo("还剩21下")
WScript.Echo("还剩20下")
WScript.Echo("还剩19下")
WScript.Echo("还剩18下")
WScript.Echo("还剩17下")
WScript.Echo("还剩16下")
WScript.Echo("还剩15下")
WScript.Echo("还剩14下")
WScript.Echo("还剩13下停停慢点我有话要说")
WScript.Echo("还剩12下你继续点我就会消失滴")
WScript.Echo("还剩11下以后就看不到我拉。555555")
WScript.Echo("还剩10下你现在可以选择停止")
WScript.Echo("还剩9下。你还点啊不要我拉")
WScript.Echo("还剩8下有点伤心拉干嘛丢弃人家")
WScript.Echo("还剩7下。疯了你有点负意")
WScript.Echo("还剩6下。对。你就点吧我恨你")
WScript.Echo("还剩5下不明白删除我你就好吗")
WScript.Echo("还剩4下真要删除我")
WScript.Echo("还剩3下。可是我真的很眷恋你。。。")
WScript.Echo("还剩2下。不要这么绝情嘛人家是爱你的")
WScript.Echo("还剩1下。哼既然你这么绝情。也别怪我无义")
WScript.Echo("我本因该消失的,不过我留恋你滴芳容,上帝又给了一次机会。")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")
WScript.Echo("想结素我么?那你就再多点一次")

11
windows/vbs/小秘密.vbs Normal file
View File

@ -0,0 +1,11 @@
text()
function text()
dim a
a=InputBox("做我女朋友吧!")
if a="好的"then
Msgbox"臭宝,真乖!",0,"恭喜"
else
Msgbox"臭宝,不同意还想跑!",0,"再来一次"
text()
end if
end function

53
windows/快捷键.txt Normal file
View File

@ -0,0 +1,53 @@
Windows快捷键大全
一、常见用法:
F2           当你选中一个文件的话这意味着“重命名”
F10或ALT        激活当前程序的菜单栏
windows键或CTRL+ESC   打开开始菜单
DELETE         删除被选择的选择项目如果是文件将被放入回收站
SHIFT+DELETE      删除被选择的选择项目如果是文件将被直接删除而不是放入回收站
CTRL+N         打开“桌面”文件夹
CTRL+O         打开“打开文件”对话框
CTRL+P         打开“打印”对话框
CTRL+S         保存当前操作的文件
CTRL+X         剪切被选择的项目到剪贴板
CTRL+INSERT 或 CTRL+C  复制被选择的项目到剪贴板
SHIFT+INSERT 或 CTRL+V 粘贴剪贴板中的内容到当前位置
ALT+BACKSPACE 或 CTRL+Z 撤销上一步的操作
ALT+SHIFT+BACKSPACE   重做上一步怀废 牟僮?br>
Windows键+M       最小化所有被打开的窗口。
Windows键+E       打开资源管理器
Windows键+R       打开“运行”对话框
Windows键+'+' 放大镜
SHIFT+F10或鼠标右击   打开当前活动项目的快捷菜单
ALT+F4         关闭当前应用程序
ALT+SPACEBAR      打开程序最左上角的菜单
ALT+TAB         切换当前程序
ALT+ESC         切换当前程序
ALT+ENTER        将windows下运行的MSDOS窗口在窗口和全屏幕状态间切换
PRINT SCREEN      将当前屏幕以图象方式拷贝到剪贴板

740
windows/注册表.txt Normal file
View File

@ -0,0 +1,740 @@
一、注册表的由来
PC机及其操作系统的一个特点就是允许用户按照自己的要求对计算机系统的硬件和软件进行各种各样的配置。早期的图形操作系统如Win3.x中对软硬件工作环境的配置是通过对扩展名为.ini的文件进行修改来完成的但INI文件管理起来很不方便因为每种设备或应用程序都得有自己的INI文件并且在网络上难以实现远程访问。
为了克服上述这些问题在Windows 95及其后继版本中采用了一种叫做“注册表”的数据库来统一进行管理将各种信息资源集中起来并存储各种配置信息。按照这一原则Windows各版本中都采用了将应用程序和计算机系统全部配置信息容纳在一起的注册表用来管理应用程序和文件的关联、硬件设备说明、状态属性以及各种状态信息和数据等。
与INI文件不同的是
1.注册表采用了二进制形式登录数据;
2.注册表支持子键,各级子关键字都有自己的“键值”;
3.注册表中的键值项可以包含可执行代码,而不是简单的字串;
4.在同一台计算机上,注册表可以存储多个用户的特性。
注册表的特点有:
1.注册表允许对硬件、系统参数、应用程序和设备驱动程序进行跟踪配置,这使得修改某些设置后不用重新启动成为可能。
2.注册表中登录的硬件部分数据可以支持高版本Windows的即插即用特性。当Windows检测到机器上的新设备时就把有关数据保存到注册表中另外还可以避免新设备与原有设备之间的资源冲突。
3.管理人员和用户通过注册表可以在网络上检查系统的配置和设置,使得远程管理得以实现。
二、使用注册表
1.大家可以在开始菜单中的运行里输入regedit
2.也可以在DOS下输入regedit
三、注册表根键说明
hkey_classes_root 包含注册的所有OLE信息和文档类型是从 hkey_local_machine\software\classes复制的。
hkey_current_user 包含登录的用户配置信息是从hkey_users\当前用户子树复制的。
hkey_local_machine 包含本机的配置信息。其中config子树是显示器打印机信息 enum子树是即插即用设备信息system子树是设备驱动程序和服务参数的控制集合software子树是应用程序专用设置。
hkey_users 所有登录用户信息。
hkey_current_config 包含常被用户改变的部分硬件软件配置如字体设置、显示器类型、打印机设置等。是从hkey_local_machine\config复制的。
hkey_dyn_data 包含现在计算机内存中保存的系统信息。
四、注册表详细内容
  Hkey_local_machine\software\microsoft\windows\currentVersion\explorer\user shell folders 保存个人文件夹、收藏夹的路径
  Hkey_local_machine\system\currentControlSet\control\keyboard Layouts保存键盘使用的语言以及各种中文输入法
Hkey_users\.Default\software\microsoft\internet explorer\typeURLs保存IE浏览器地址栏中输入的URL地址列表信息。清除文档菜单时将被清空。
  Hkey_users\.Default\so..\mi..\wi..\currentVersion\ex..\menuOrder\startMenu 保留程序菜单排序信息
Hkey_users\.Default\so..\microsoft\windows\currentVersion\explorer\RunMRU 保存“开始 * 运行...“中运行的程序列表信息。清除文档菜单时将被清空。
  Hkey_users\.Default\so..\microsoft\windows\currentVersion\explorer\ecentDocs 保存最近使用的十五个文档的快捷方式(删除掉可解决文档名称重复的毛病),清除文档菜单时将被清空。
  Hkey_local_machine\software\microsoft\windows\currentVersion\uninstall 保存已安装的Windows应用程序卸载信息。
hkey_users\.default\software\microsoft\windows\currentVersion\applets 保存Windows应用程序的纪录数据。
Hkey_local_machine\system\CurrentControlSet\services\class 保存控制面板-增添硬件设备-设备类型目录。
  Hkey_local_machine\system\CurrentControlSet\control\update 立即刷新设置。值为00设置为自动刷新01设置为手工刷新[在资源管理器中按F5刷新]。
HKEY_CURRENT_USER\Control Panel\Desktop 新建串值名MenuShowDelay=0 可使“开始”菜单中子菜单的弹出速度提高。新建串值名MinAnimate值为1启动动画效果开关窗口值为0取消动画效果。
  Hkey_local_machine\software\microsoft\windows\currentVersion\run 保存由控制面板设定的计算机启动时运行程序的名称,其图标显示在任务条右边。[启动文件夹程序运行时图标也在任务条右边]
hkey_users\.default\software\microsoft\windows\currentVersion\run保存由用户设定的计算机启动时运行程序的名称其图标显示在任务条右侧。
HKEY_CLASS_ROOT/Paint.Pricture/DefaultIcon 默认图片的图标。双击窗口右侧的字符串,在打开的对话框中删除原来的键值,输入%1。重新启动后在“我的电脑”中打开Windows目录选择“大图标“然后你看到的Bmp文件的图标再也不是千篇一律的画板图标了而是每个Bmp文件的略图。
  Hkey-local-machine\ software\ microsoft\ windows\ currentVersion\ Policies\ Ratings 保存IE4.0中文版“安全”*“分级审查”中设置的口令(数据加密)。
  Hkey-local-machine\ software\ microsoft\ windows\ currentVersion\ explorer\ desktop\nameSpace保存桌面中特殊的图标,如回收站、收件箱、MS Network等。
五、如何备份注册表
利用注册表编辑器手工备份注册表
  注册表编辑器Regedit是操作系统自带的一款注册表工具通过它就能对注册表进行各种修改。当然"备份"与"恢复"注册表自然是它的本能了。
1通过注册表编辑器备份注册表
  由于修改注册表有时会危及系统的安全因此不管是WINDOWS 98还是WINDOWS 2000甚至WINDOWS XP都把注册表编辑器"藏"在了一个非常隐蔽的地方,要想"请"它出山,必须通过特殊的手段才行。点击"开始"菜单,选择菜单上的"运行"选项,在弹出的"运行"窗口中输入"Regedit"后,点击"确定"按钮,这样就启动了注册表编辑器。
  点击注册表编辑器的"注册表"菜单,再点击"导出注册表文件"选项,在弹出的对话框中输入文件名"regedit",将"保存类型"选为"注册表文件",再将"导出范围"设置为"全部",接下来选择文件存储位置,最后点击"保存"按钮,就可将系统的注册表保存到硬盘上。
  完成上述步骤后,找到刚才保存备份文件的那个文件夹,就会发现备份好的文件已经放在文件夹中了。
2在DOS下备份注册表
  当注册表损坏后WINDOWS包括"安全模式"无法进入此时该怎么办呢在纯DOS环境下进行注册表的备份、恢复是另外一种补救措施下面来看看在DOS环境下怎样来备份、恢复注册表。
  在纯DOS下通过注册表编辑器备份与恢复注册表前面已经讲解了利用注册表编辑器在WINDOWS环境下备份、恢复注册表其实"Regedit.exe"这个注册表编辑器不仅能在WINDOWS环境中运行也能在DOS下使用。
  虽然在DOS环境中的注册表编辑器的功能没有在WINDOWS环境中那么强大但是也有它的独到之处。比如说通过注册表编辑器在WINDOWS中备份了注册表可系统出了问题之后无法进入WINDOWS此时就可以在纯DOS下通过注册表编辑器来恢复注册表。
  应该说在DOS环境中备份注册表的情况还是不多见的一般在WINDOWS中备份就行了不过在一些特殊的情况下这种方式就显得很实用了。
  进入DOS后再进入C盘的WINDOWS目录在该目录的提示符下输入"regedit"后按回车键,便能查看"regedit"的使用参数。
  通过"Regedit"备份注册表仍然需要用到"system.dat"和"user.dat"这两个文件,而该程序的具体命令格式是这样的:
  Regedit /L:system /R:user /E filename.reg Regpath
参数含义:
/Lsystem指定System.dat文件所在的路径。
/Ruser指定User.dat文件所在的路径。
/E此参数指定注册表编辑器要进行导出注册表操作在此参数后面空一格输入导出注册表的文件名。
Regpath用来指定要导出哪个注册表的分支如果不指定则将导出全部注册表分支。在这些参数中"/Lsystem"和"/Ruser"参数是可选项如果不使用这两个参数注册表编辑器则认为是对WINDOWS目录下的"system.dat"和"user.dat"文件进行操作。如果是通过从软盘启动并进入DOS那么就必须使用"/L"和"/R"参数来指定"system.dat"和"user.dat"文件的具体路径,否则注册表编辑器将无法找到它们。
  比如说如果通过启动盘进入DOS则备份注册表的命令是"Regedit /L:C:\windows\/R:C:\windows\/e regedit.reg",该命令的意思是把整个注册表备份到WINDOWS目录下其文件名为"regedit.reg"。而如果输入的是"regedit /E D:\regedit.reg"这条命令则是说把整个注册表备份到D盘的根目录下省略了"/L"和"/R"参数),其文件名为"Regedit.reg"。
3用注册表检查器备份注册表
  在DOS环境下的注册表检查器Scanreg.exe可以用来备份注册表。
命令格式为:
Scanreg /backup /restore /comment
参数解释:
/backup用来立即备份注册表
/restore按照备份的时间以及日期显示所有的备份文件
/comment在/restore中显示同备份文件有关的部分
注意:在显示备份的注册表文件时,压缩备份的文件以.CAB文件列出CAB文件的后面单词是Started或者是NotStartedStarted表示这个文件能够成功启动Windows是一个完好的备份文件NotStarted表示文件没有被用来启动Windows因此还不能够知道是否是一个完好备份。
比如如果我们要查看所有的备份文件及同备份有关的部分命令如下Scanreg /restore /comment
六、使用技巧
上面介绍的都是概念上的东东,下面让我们实际操作吧
1.加快开机及关机速度
  在[开始]-->[运行]-->键入[Regedit]-->[HKEY_CURRENT_USER]-->[Control Panel]-->[Desktop],将字符串值[HungAppTimeout]的数值数据更改为[200],将字符串值[WaitToKillAppTimeout]的数值数据更改为1000.另外在[HKEY_LOCAL_MACHINE]-->[System]-->[CurrentControlSet]-->[Control],将字符串值[HungAppTimeout]的数值数据更改为[200],将字符串值[WaitToKillServiceTimeout]的数值数据更改1000
2.自动关闭停止响应程序
  在[开始]-->[运行]-->键入[Regedit]-->[HKEY_CURRENT_USER]-->[Control Panel]-->[Desktop],将字符串值[AutoEndTasks]的数值数据更改为1重新启动即可
3.清除内存内被不使用的DLL文件
  在[开始]-->[运行]-->键入[Regedit]-->[HKKEY_LOCAL_MACHINE]-->[SOFTWARE]-->[Microsoft]-->[Windows]-->[CurrentVersion],在[Explorer]增加一个项[AlwaysUnloadDLL]默认值设为1。注如由默认值设定为[0]则代表停用此功能
4.加快菜单显示速度
  在[开始]-->[运行]-->键入[Regedit]-->[HKEY_CURRENT_USER]-->[Control Panel]-->[Desktop],将字符串值[MenuShowDelay]的数值数据更改为[0],调整后如觉得菜单显示速度太快而不适应者可将[MenuShowDelay]的数值数据更改为[200],重新启动即可
5.禁止修改用户文件夹 
  找到HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer。如果要锁定“图片收藏”、“我的文档”、“收藏夹”、“我的音乐”这些用户文件夹的物理位置分别把下面这些键设置成1DisableMyPicturesDirChangeDisablePersonalDirChangeDisableFavoritesDirChangeDisableMyMusicDirChange
6.减小浏览局域网的延迟时间 
  和Windows 2000一样XP在浏览局域网时也存在烦人的延迟问题但介绍这个问题的资料却很难找到。如果你浏览一台Win 9x的机器例如在网上邻居的地址栏输入“\computername”XP的机器会在它正在连接的机器上检查“任务计划”。这种搜索过程可能造成多达30秒的延迟。如果你直接打开某个共享资源例如在网上邻居的地址栏输入“\computernameshare”就不会有这个延迟过程。要想避免XP搜索“任务计划”的操作提高浏览网络的速度你可以删除HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerRemoteComputerNameSpace{D6277990-4C6A-11CF-8D87-00AA0060F5BF}子键。该键的类型是REG_SZ
7.屏蔽系统中的热键  
  点击“开始”→“运行”输入Regedit打开注册表编辑器。然后依次打开到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer新建一个双字节值键名为“NoWindows Keys”键值为“1”这样就可以禁止用户利用系统热键来执行一些禁用的命令。如果要恢复只要将键值设为0或是将此键删除即可
8.关闭不用的共享  
  安全问题一直为大家所关注,为了自己的系统安全能够有保证,某些不必要的共享还是应该关闭的。用记事本编辑如下内容的注册表文件,保存为任意名字的.Reg文件使用时双击即可关闭那些不必要的共享  
  Windows Registry Editor Version 5.00  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters]  
  "AutoShareServer"=dword:00000000  
  "AutoSharewks"=dword:00000000  
  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]  
  "restrictanonymous"=dword:00000001
9.让IE支持多线程下载
  一般情况下大家都使用多线程下载软件如Flashget等下载文件其实IE也可以支持多线程下载的只是微软将这个功能给藏了起来。我们把它给挖出来就可以使用了。打开注册表编辑器在注册表HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings下新建双字节值项“MaxConnectionsPerServer”它决定了最大同步下载的连线数目一般设定为58个连线数目比较好。另外对于HTTP 1.0服务器可以加入名为“MaxConnectionsPer1_0Server”的双字节值项它也是用来设置最大同步下载的数目也可以设定为58。 
10.让WINDOWS XP自动登陆 
  打开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon在右边的窗口中的新建字符串"AutoAdminlogon",并把他们的键值为"1"并且把“DefaultUserName”的值设置为用户名并且另外新建一个字符串值“DefaultPassword”并设其值为用户的密码
七、我们来让我们的系统瘦瘦身
删除多余的虚拟光驱图标
  当我们在系统中安装了虚拟光驱后“我的电脑”中就会多出一个光盘图标即便日后你不再使用虚拟光驱虚拟光驱图标还会继续保留实在没有必要。我们动手来删除这个多余的虚拟光驱图标单击“开始→运行”输入“regedit”按下“确定”键后打开注册表编辑器依次展开HKEY_LOCAL_MACHINE\Enum\SCSI分支在SCSI子键下通常有两个子键它们分别对应着虚拟光驱和物理光驱把SCSI下的子键全部删除重新启动电脑后虚拟光驱图标就会被删除。
删除多余的系统级图标
  系统级图标是指在安装Windows时由系统自动创建的图标如回收站、收件箱、网上邻居等其中有些图标对用户来说并无用处但这些图标无法直接删除。打开注册表编辑器依次展开HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\
  explorer\Desktop\NameSpace分支然后删除不需要的子键。关闭注册表编辑器重新启动电脑后你会发现桌面上不需要的系统级图标已经消失了。
删除“运行”中多余的选项
  如果你多次使用“开始→运行”菜单会发现它的“打开”窗口被一大堆不再需要的命令弄得凌乱不堪。打开注册表编辑器依次展开HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion
  \Explorer\RunMRU分支将右侧窗口的相关键值删除即可。
删除“查找”中多余的选项
  依次展开HKEY_USER\.Default\Software\Microsoft\Windows\CurrentVersion
  \Explorer\Doc-FindSpecMRU分支将右侧窗口中的相关键值删除即可。
删除多余的键盘布局
  Windows试图成为世界的宠儿因此其键盘布局适合于各国各类人的使用习惯。打开注册表编辑器依次展开HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
  \KeyboardLayouts分支我们可以看到该分支下保存了西班牙语(传统)、丹麦语、德语(标准)等多种键盘布局,如果你用不到这些语言的键盘布局,完全可以直接删除这些子键。
删除多余的区域设置
  与上述键盘布局相类似的还有Windows的区域设置在注册表编辑器中展开HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
  \Nls\Locale分支简体中文使用者完全可以只保留“00000804”键值其他可以毫不留情地删除。
八、高级篇
1、自动清除登录窗口中上次访问者的用户名
  通常情况下用户在进入WINNT网络之前必须输入自己的用户名称以及口令。但是当你重新启动计算机登录WINNT时WINNT会在缺省情况下将上一次访问者的用户名自动显示在登录窗口的“用户名”文本框中。这样一来有些非法用户可能利用现有的用户名来猜测其口令一旦猜中的话将会对整个计算机系统产生极大的安全隐患。为了保证系统不存在任何安全隐患我们可以通过修改WINNT注册表的方法来也提供了启动时自动以某一个组的用户名称和口令进行访问WINNT而不需要通过人工设置的方法来自动清除登录窗口中上次访问者的用户名信息。要实现自动清除功能必须要进行如下配置  A、在开始菜单栏中选择运行命令在随后打开的运行对话框里输入REGEDIT命令从而打开注册表编辑器。
  B、在打开的注册表编辑器中依次展开以下的键值  [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON]
  C、在编辑器右边的列表框中选择“DONTDISPLAYLASTUSERNAME”键值名称如果没有上面的键值可以利用“编辑”菜单中的“新建”键值命令添加一个并选择所建数据类型为“REG_SZ”。
  D、选择指定的键值并双击当出现“字符串编辑器”对话框时在“字符串”文本框中输入“1”其中“1”代表起用该功能“0”代表禁止该功能。
  E、当用户重新启动计算机登录WINNT时NT登录对话框中的“用户名”文本框中将是空白的。
2、为一些非SCSI接口光驱进行手工配置
  如果你想在WINNT上安装一个非SCSI接口的光驱在WINNT版本较高的计算机中这中类型的光驱可能被自动识别并自动由计算机来完成其安装任务不巧的是你的计算机中安装了一个低版本的操作系统例如安装了WINNT3.5还没有时间来升级但现在就着急用光驱呢那该怎么办才好呢不急虽然Windows NT3.5不能自动识别非SCSI接口的光驱但我们可以通过手工安装的方式来帮你轻松搞定这个小问题具体工作步骤为
  A、首先必须将你手中的对应的非SCSI接口的CD-ROM驱动程序从安装盘拷贝到WINNT\SYSTEM32\DRIV ERS目录下。
  B、在WINNT主群组中打开Setup图标。
  C、从OPTION菜单中选择“Add/Remove SCSI Adapters”。  D、用鼠标单击ADD按钮为你的非SCSI接口CD-ROM选择对应的驱动程序。
  E、接着单击“INSTALL”按钮进行一些相关参数的配置。  F、退出Windows NT重新启动计算机后光驱就会有用了。
3、增加NTFS性能
  如果用户想增加NTFS的性能也可以通过修改注册表的方法来达到目的具体实现步骤如下
  A、打开注册表编辑器并在编辑器中依次展开以下键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
  B、在注册表编辑器中用鼠标单击“编辑”菜单并在下拉菜单中选择“新建”菜单项并在其弹出的子菜单中单击“DWORD值”。
  C、 在编辑器右边的列表中输入DWORD值的名称为“NtfsDisableLastAccessUpdate”。
  D、 接着用鼠标双击NtfsDisableLastAccessUpdate键值编辑器就会弹出一个名为“字符串编辑器”的对话框在该对话框的文本栏中输入数值“1”其中0代表“取消”该项功能1代表“启用”该项功能。
  E、设置好后重新启动计算机就会使上述功能有效。
4、修复镜像组
  A、当镜像磁盘组中的驱动器发生故障时系统自动向其余的驱动器发出发送数据请求留下工作驱动器单独运行。此时用户需要进入Disk Administrator选择镜像组再选择FaultTolerance/Break Mirror将镜像组分为两个独立部分。
  B、工作的驱动器得到磁盘组所用的驱动器盘符故障驱动器得到系统的下一个有效盘符。关闭NT Server更换一个相同型号的硬盘驱动器。
  C、重新启动NT Server运行Disk Administor在新驱动器上选择分区和未用空间选择Fault Tolerance/Establish Mirror即可对新驱动器作镜像。
5、自定义启动信息
  每次当WINNT启动时它都会显示“请按CTRL+ALT+DELETE键来登录”的信息而如果你希望用户在按完CTRL+ALT+DELETE键后画面上自动显示用户自己希望所看到的信息可以通过如下的相关设置来进行
  A、在开始菜单栏中选择运行命令在随后打开的运行对话框里输入REGEDIT命令从而打开注册表编辑器。
  B、在打开的注册表编辑器中依次展开以下的键值  [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON]
  C、在编辑器右边的列表框中选择“LEGALNOTICECAPTION”键值名称如果没有上面的键值可以利用“编辑”菜单中的“新建”键值命令添加一个并选择所建数据类型为“REG_SZ”。
  D、选择指定的键值并双击当出现“字符串编辑器”对话框时在“字符串”文本框中输入用户希望看到的信息窗口的标题内容例如输入“WINNT网络”。
  E、接着在下面一个“字符串”文本框中输入信息窗口要显示的具体内容例如输入“欢迎使用WINNT网络”。
  F、重新启动计算机后再次登录进WINNT网络时用户将会看到自己在上面设置的内容。
6、加速文件管理系统缓存
  大家知道计算机的速度有很大一部分与内存相关,如果内存容量大一点,计算机运行速度就会相应快一点。但是假设在内存一定的情况下,如何来提高计算机的运行速度呢?这就是我们下面通过注册表设置要实现的内容,具体步骤如下:
  A、在开始菜单栏中选择运行命令在随后打开的运行对话框里输入REGEDIT命令从而打开注册表编辑器。
  B、在打开的注册表编辑器中依次展开以下的键值  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management]。
  C、在编辑器右边的列表框中选择“IoPageLockLimit”键值名称如果没有上面的键值可以利用“编辑”菜单中的“新建”键值命令添加一个并选择所建数据类型为“DWORD”。
  D、选择指定的键值并双击当出现“字符串编辑器”对话框时在“字符串”文本框中输入用户需要的数值系统默认缓存为512K其他的参考值如下
  RAM (MB) IoPageLockLimit  32  4096000  64  8192000  128  16384000  256+  65536000
  E、当用户重新启动计算机登录WINNT时文件管理系统缓存将得到改善。
7、增加“关闭系统”按钮
  在NT计算机中“关闭系统”按钮作为缺省值在登陆对话框中提供这个任务按钮允许用户不必先登陆即可关闭系统。在NT SERVER中虽然没有这个功能但可以通过修改注册表使系统在登陆对话框中增加一个“关闭系统”的按钮具体操作方法如下  
A、打开注册表编辑器并在编辑器中依次展开以下键值  [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON]。
  B、在编辑器右边的列表中用鼠标选择“SHUTDOWNWITHOUTLOGON”键值。
  C、接着用鼠标双击“SHUTDOWNWITHOUTLOGON”键值编辑器就会弹出一个名为“字符串编辑器”的对话框在该对话框的文本栏中输入数值“1”其中0代表取消“关闭系统”按钮1代表增加“关闭系统”按钮。
  D、退出后重新登录在登录的界面中会增加一个“关闭系统”的按钮。
8、在NT下创建一个镜像集
  A、先用Disk Administerator创建镜像集的第一个分区表选中该分区在另一个磁盘驱动器内的磁盘空间的未用区域上进行Ctrl鼠标单击操作以把未用的磁盘区域和第一个分区均选上。
  B、从Disk Ad ministor的Fault Tolerlance(容错)菜单中选中Establish Mirror(建立镜像 )Disk Administor将在被选自由盘区外创建一个磁盘分区。该分区与原有分区一样大并包含原分区表上所有数据的备份。
  C、如果要取消镜像集(并非删除镜像集)即仅仅停止两个分区之间的数据复制只需从Disk Administor中选择Fault Tolerance/Break Mirror。
9、登录局域网超时自动断开
  在登录Windows NT网络时有可能用户不小心输错了登录参数或其他原因导致了登录网络可能需要花费好长时间这种情况是我们不想看到的。为了解决这种问题我们可以通过注册表来配置为闲置超时断开以分钟为单位具体步骤为
  A、打开注册表编辑器并在编辑器中依次展开以下键值  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters]
  B、在编辑器右边的列表中用鼠标选择“AUTODISCONNECT”键值。
  C、接着用鼠标双击“AUTODISCONNECT”键值编辑器就会弹出一个名为“字符串编辑器”的对话框在该对话框的文本栏中输入数值“1”其中0代表取消自动断开功能1代表使用自动断开功能。
  D、退出后重新登录网络上述功能就会生效。
10、改变远程访问服务的缺省端口传输速度
  Windows NT远程访问服务为每个RAS串行端口设置两种BPS速度载波BPS与联接BPS速度前者是指两个Modem通过电话线传输数据的速度后者则指Modem与主机串口间的数据传输速度当远程服务被启动时计算机首先将其联接BPS速度值存放于\System Root\\System32\RAS\Modem.INF文件中以MAXC ARRIERBPS参数形式存放然后将该值保存在RASSERIAL.INF文件中以后每次进行传输时对串口作初始化只需改变SERIAL.INI文件即可改变串口传输速度具体操作方法如下
  A、将SERIAL.INI文件用编辑器打开。
  B、将INITIALBPS参数改为自己所希望的数值。
  C、将上述改动保存成一个文件文件名仍为SERIAL.INI。
  D、打开“开始”菜单并单击“运行”命令在运行栏中输入RasAdmin命令。
  E、从服务器菜单中选择“Stop Remote Access Service”再选择“Start Remote Access Service”上述设置就会生效。 自动检测慢网登陆
  上面我们曾经说过在登录NT网络时有可能很慢。同样地如果Windows NT检测速度有困难可以取消。具体实现步骤为
  A、打开注册表编辑器并在编辑器中依次展开以下键值
 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon]
  B、在编辑器右边的列表中用鼠标选择“SlowLinkDetectEnabled”键值如果没有该键值必须新建一个DWORD值名称设置为“SlowLinkDetectEnabled”。
  C、接着用鼠标双击“SlowLinkDetectEnabled”键值编辑器就会弹出一个名为“字符串编辑器”的对话框在该对话框的文本栏中输入数值“1”其中0代表取消自动检测慢网登陆功能1代表使用自动检测慢网登陆功能。
  D、退出后重新登录网络上述设置就会起作用。
12、加快网络传输速度
  对于拨号用户来说,时间就是金钱,怎样才能节约时间,节省金钱呢?回答是提高网络传输速度。那又如何提高网络传输速度呢?大家知道,网络速度主要是受网络带宽限制的。增加带宽不是拨号用户所能做到的,他们唯一能做的就是把调制解调器的传输速度能够再提高一点。其实拨号用户还可以从计算机本身运行速度出发,尽量能挖掘计算机在网络加速方面最大的潜能。下面我们就通过一些设置来尽量加快网络传输速度,具体设置如下:
  A、在开始菜单栏中选择运行命令在随后打开的运行对话框里输入REGEDIT命令从而打开注册表编辑器。
  B、在打开的注册表编辑器中依次展开以下的键值  [HKEY_LOCAL_MACHINE\System\Current Control Set\Services\Class\NetTrans00n ]其中n表示个别拔号网络连接项号码。
  C、在编辑器右边的列表框中选择“MaxMTU”键值名称如果没有上面的键值可以利用“编辑”菜单中的“新建”键值命令添加一个并选择所建数据类型为“DWORD”值。
  D、选择指定的键值并双击当出现“字符串编辑器”对话框时在“字符串”文本框中输入“576”576代表最大传输单元值。
  E、接着在编辑器菜单栏中依次选择“编辑”→“新增”→“字符串值”右边列表窗口就会多出一个新字符串把它 命名为“MaxSSS”再双按这个字符串值并把它设定为“536”。
  F、重新返回到编辑器的主操作界面并依次展开如下键值 [HKEY_LOCAL_MACHINE\System\Current Control Set\Services\VxD\MSTCP]。
  G、按照上述同样的操作方法在编辑器右边的列表中依次添加字符串值“DefaultRcvWindow”、 “DefaultTTL”并且把它们的数值分别设置为“2144”“64”。
  H、当用户重新启动计算机登录WINNT时上述所有的设置将会生效这样计算机将会发挥它在网络加速方面最大的能量。
13、自动登陆网络
  通常情况下用户在进入WINNT网络之前必须输入自己的用户名称以及口令。但是WINNT也提供了启动时自动以某一个组的用户名称和口令进行访问WINNT而不需要通过人工设置的方法来输入登陆网络的参数。要实现自动登陆功能必须要进行如下配置
  A、打开注册表编辑器并在编辑器中依次展开以下键值
 [HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENT VERSION\WINLOGON]
  B、用鼠标单击右边的“AUTOADMINLOGON”键值名称编辑器就会弹出一个名为“字符串编辑器”的对话框在该对话框的文本栏中输入数值“1”。
  C、接着再用鼠标选择右边的“DEFAULTDOMAINNAME”键值名称并在随后弹出的文本栏中输入所要登陆的域名名称或所要访问的计算机名称例如输入“DOMAIN”域或“COM”计算机名称然后单击“确定”按钮。
  D、按照同样的操作方法选择右面的“DEFAULTUSERNAME”键值名称并在“字符串”文本框中输入登陆网络的用户名称例如输入管理员名称“ADMINISTRATOR”并单击“确定”按钮。
  E、最后在注册表编辑器中用鼠标单击“编辑”菜单并在下拉菜单中选择“新建键值”命令然后在注册表右边的列表中输入键值名称为“DEFAULTPASSWORD”键值类型为“REG_SZ”接着单击“确定”按钮。
  F、 用鼠标双击“DEFAULTPASSWORD”键值在弹出的对话框中输入用户的密码在这里我们输入系统管理员的口令作为登陆网络的密码输入完成后单击“确定”按钮结束设置工作。
  G、 让计算机重新启动,缺省设置的用户将会自动登陆到指定的网络中去。
  如果用户日后不再需要自动登陆功能时只需要把“AUTOADMINLOGON”的键值改为数值“0”即可。
14、禁止光盘的自动运行功能
  大家都很清楚每当光盘放到计算机中时WINNT就会执行自动运行功能光盘中的应用程序就会被自动运行而我们在实际工作中有时不需要这项功能那么如何屏蔽该功能呢。此时我们同样可以修改注册表使此功能失效具体做法如下
  A、打开注册表编辑器并在编辑器中依次展开以下键值  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Cdrom] 。
  B、在编辑器右边的列表中用鼠标选择“AUTORUN”键值。
  C、接着用鼠标双击“AUTORUN”键值编辑器就会弹出一个名为“字符串编辑器”的对话框在该对话框的文本栏中输入数值“0”其中0代表“禁用”光盘的自动运行功能1代表“启用”光盘的自动运行功能。
  D、设置好后重新启动计算机就会使上述功能有效。
15、取消系统检测串口提高NT系统启动速度
  计算机每次启动都会对计算机的硬件要重新检测一遍这需要花费一定的时间也因此就减慢了计算机的启动速度。在这里笔者向大家介绍一下通过一些设置来取消系统检测串口从而达到提高NT系统启动速度的目的具体步骤如下
  A、在开始菜单中用查找的方法将Boot.INI文件找出来然后将该文件的“只读”属性屏蔽掉以便于我们在其中进行一些相关改动。
  B、接着用一个文本编辑器将Boot.INI文件打开并修改[operating system]段的内容将其中每一行后加上NoserialMice参数如下所示
  修改Boot.INI文件
  ……
  [operating system]
  multi(0) disk(0) rdisk(0)
  partition(1)\WINNT40="Windows NT
  Workstation Version4.0"/NoSerialMice  ……
  C、把上述修改的内容保存起来文件名仍为Boot.INI。
  D、退出Windows NT重新启动计算机后上述配置就会生效。
XP六条未公开的秘技
支持137 GB以上大硬盘
  想要使用137 GB以上大硬盘必须使用48位LBA模式。首先你的主板BIOS必须支持48Bit LBA其次WinXP 家用版和专业版必须安装SP1补丁。然后打开注册表在如下路径“HKEY_LOCAL_MACHINE System CurrentControlSet Services Atapi Parameter”找到“EnableBigLba”选项将其值由“0”改为“1”。如果该项不存在可以自建“DWORD值”项目同样设置.最后重新启动即可.
删除共享文档
  如果你不需要共享文件可以这样移除它进入HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer My computer Namespace DelegateFolders删除键值“”。
锁定桌面
  想要锁定桌面不被别人肆意修改可以使用很多工具例如TweakUI不过其实在注册表里进行小小的改动即可实现进入HKEY_CURRENT_USER Software Microsoft Windows CurrentVersion Policies Explorer建立DWORD值“NoDesktop”将其值修改为“1”即可。
停用“上次访问时间标记Last Access Time Stamp
  不想要这项功能可以这样修改进入HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Control File system新建DWORD值“NtfsDisableLastAccessUpdate”将其值修改为“1”即可。
设置“远程访问连接服务器RAS
  需要的话可以这样修改进入HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion Winlogon新建字符串值“KeepRasConnections”将其值修改为“1”即可。
使用明文密码Lain Text Password
  访问UNIX或者LINUX服务器的时候有时需要明文密码这在XP下很容易实现找到“HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services lanmanworkstation parameter enableplaintextpassword”并将其值设置为“1”即可
控制面板
在Windows 2000的控制面板中有1 9个标准的应用小程序( a p p l e t ),每一个应用小程序都有
影响注册表条目的能力(具有添加硬件和安装软件功能的系统还包括另外一些应用小程序)
添加/删除硬件系统H K E Y _ L O C A L _ M A C H I N E \ H A R D WA R E
添加/删除程序系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
管理工具系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
日期/时间系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
显示系统和用户H K E Y _ L O C A L _ M A C H I N E \ S Y S T E M和HKEY _
CURRENT _ USER
文件夹选项系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
字体系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
I n t e r n e t选项系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
键盘系统和用户H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E和HKEY _
CURRENT _ USER
鼠标系统和用户H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E和HKEY _
C U R R E N T _ U S E R
网络和拨号连接系统H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E
电话和调制解调器选项系统H K E Y _ L O C A L _ M A C H I N E \ S Y S T E M
电源选项系统H K E Y _ L O C A L _ M A C H I N E \ H A R D WA R E
打印机系统H K E Y _ L O C A L _ M A C H I N E \ S Y S T E M
区域设置系统H K E Y _ L O C A L _ M A C H I N E \ S Y ST E M
任务计划系统H K E Y _ L O C A L _ M A C H I N E \ S O FT WA R E
声音和多媒体系统和用户H K E Y _ L O C A L _ M A C H I N E \ S O F T WA R E和HKEY _C U R R E N T _ U S E R
系统系统和用户H K E Y _ L O C A L _ M A C H I N E \ S OF T WA R EHKEY _
L O C A L _ M A C H I N E \ S Y S T E M和HKEY_CURRENT_USER
以前对于在Windows 2000或Windows XP上玩CS的人来说是否开显卡的垂直同步是个两难的选择。不开垂直同步可以得到更高的FPS但画面老是抖动打时间长了眼睛很累开了垂直同步FPS就肯定超不过60。但我相信还有很多朋友不知道该怎么办因此把解决办法公布希望能对大家有所帮助。
在Window 2000或XP下开垂直同步后FPS超不过60的原因是Window 2000或XP在这种情况下会把游戏中的FPS设定为Windows的缺省值60再好的配置也没用。
解决这个问题的办法很多可以用第三方程序如PowerStrip等但这种办法需要外挂程序可能不安全。最近我终于找到最根本的解决办法就是在直接在注册表里把Windows的缺省值改成100或更高只要你的显示器支持就可以。请千万注意在修改注册表前一定要确认你的显示器在不同的分辨率下所支持的最高刷新频率。比如我的电脑在1024*768的分辨率下能达到100Hz的刷新频率我玩CS也是在这个分辨率下玩所以我才敢把Windows的缺省值设为100。另外也请注意这样修改完注册表后你电脑桌面的分辨率和刷新频率也会被限定为这个数值。
修改注册表的方法如下:
Open regedit and find this key:
运行regedit命令进入注册表修改界面
进入[HKEY_LOCAL_MACHINEsystemCurentControlSetControlClass],打开"Class"键,你将看到一大排的键,类似于
{4D36E96E-E325-11CE....}
如果你选中其中一个键你将可以看到一些键值,如"Default"、"Class"等,并指明设备的种类,如"Modem", "Keyboards"等,逐个打开这些{4D36E96E-E325-11CE....}键,直到看到"Class"的键值是"Monitor"。好的,我们已经找到控制显示器的注册信息了,接下来就是在这里面该缺省值了。
打开你刚找到的那个键里面至少应该有1个键叫做"0000",这里也可能有其他的键,如"0001"、"0002"等。如果里面只有个"0000",那就简单了,你直接在"0000"里按下面的方法修改就可以了。如果有多个键,你就必须逐个找出来哪个键是控制你的显示器的,方法是逐个键地按照下面说的“修改缺省值的操作”进行修改,修改后立即用下面说的“检查缺省值是否修改”的方法检查,如果相符就说明这个键是控制你显示器的,否则就不是。
“修改缺省值的操作”方法:
打开"0000"或你找到的其他的键,你可以看到里面有个"MODES"键,打开它你将看到一个键显示的是你的显示器的最大分辨率,如"1600,1200"现在假设你要在1024*768的分辨率下达到100Hz的刷新率那么操作如下在"MODES"下增加一个键叫做"1024,768",在"1024,768"键里增加一个键叫做"Mode1",键值设为"100-100,100-100"。修改缺省值得操作完毕。
“检查缺省值是否修改”的方法:
进入"Display properties -> Setting",看分辨率是否为你设定的值,如果不是那么说明你修改的那个类似于"0000"的键不是现在控制你显示器的键,,如果分辨率是你设定的值(如1024*768),那么再进"Advanced -> Monitor"里面看显示器的刷新频率是不是也是你设定的值,如果是,选中"Hide all unsupported modes"后你的刷新频率应该只有一个值可以选择,就是你设定的值(如100Hz)。这说明你修改得正确。
总结:
修改后你进入游戏后无论游戏是用Direct3D还是OpenGL你的FPS都可以超过60了。这个修改方法对Windows 2000和Windows XP都有效
三、最新Windows XP注册表实用配置技巧
1.屏蔽当鼠标移动到标准控制按钮的提示信息
当你将鼠标移动到一个标准窗口上的三个控制按钮最小化、最大化、关闭上时它将显示每一项的文本提示。通过注册表可以屏蔽这个功能。打开注册表子键HKEY_CURRENT_USERControl panelDesktop创建一个新的键值项或者修改已经存在的键值项“MinMaxclose”字符串型并设置其值0表示屏蔽此功能1表示激活此功能。
2.通过注册表查看系统BIOS信息
在注册表里储存着关于系统主板BIOS的有关信息包括最终日期、版本号和视频BIOS日期等信息。打开注册表子键HKEY_LOCAL_MACHINEHardwareDescriptionSystem其下面的键值项Systembiosdate、Systembiosversion、Videobiosdate分别记录着这些BIOS信息。
3.启动自动最优化磁盘功能
在Windows XP系统中需要时可以自动初始优化磁盘系统的新功能。在注册表中可以控制此功能是否有效。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftDfryBootoptimizefunction新建字符串型键值项“Enable”并设置其值“Y”为此功能有效“N”反之。
4.限制自动登录的数量
这个设置可以限制自动登录的次数一旦限制已经到了额定次数自动登录功能就会拒绝登录系统。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NtCurrentVersionWinlogon创建一个新的字符串型或者修改现有的“autologoncount”键值项并且根据需要设置其值的大小。
注意每次系统重新启动autologoncount的值将被消耗一个直到为零。当值为零时将没有账户可以自动登录autologoncount和默认密码键值将从注册表中删除且autoadminlogon将被设置为零。
5.使用Windows NT/2000的登录界面登录Windows XP
Windows XP采用了一个全新的登录界面全新的登录方法和显示用户的图片信息让整个过程更加舒心、个性化。然而在某些场合可能还会用到Windows NT/2000登录界面可以通过一些组合键来实现此功能
1同时按下Ctrl+Alt键。
2连续按下Del键两次。
登录界面将变成Windows NT/2000式的界面此时你可以通过点击“取消”按钮来切换到Windows XP界面。
6.定义Windows XP时钟服务器 Windows XP有一个新的特色它可以将系统的时钟与Internet上的时钟服务器进行同步校正用以下方法你可以修改或添加默认的时钟服务器。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionDateTimeServers设置此子键的默认值为服务器的IP地址或者域名即可。
7.锁定/解除任务栏在桌面上的位置
打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced新建或者修改双字节值项“TaskbarSizeMove”并设置其键值0为锁定1则为解开锁定。修改完成后注消或重新启动使其生效。
8.改进核心存取系统性能
在具有大量RAM存储量的系统中这个技巧可以强迫Windows核心进程被驻留在存储器里而不是在程序和磁盘交换文件之间来回切换从而大大提高系统运行效率。打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerMemory Management在其下新建一个双字节值项Disablepagingexecutive并设置其值1使此功能被激活并且阻止核心进程进行磁盘页面交换0则设其为默认值。重新启动计算机使设置生效。
9.优化I/O缓冲大小的默认设置
此功能可用于改变Windows XP对于I/O缓冲大小的默认设置。打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerMemory Management新建或者编辑双字节值项“IoPageLockLimit”并设置其值其值有二进制和十六进制单位为Beyte。在设置缓冲大小时请逐渐增大数值在增大的过程中观察设置的性能因为盲目的增大也会浪费系统资源。
10.屏蔽/打开“分组相似任务栏按钮”功能
此功能用于是否将相似的窗口条目集合在一起或作为单个按钮显示在任务栏上。打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced新建或者编辑双字节值项“TaskbarGlomming”并设置其值0为屏蔽此功能1为运行此功能。
11.自定义激活“分组相似任务栏按钮”的窗口数量
在注册表里可以设置当某个窗口达到一定数量后才激活“分组相似任务栏按钮”的功能打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced新建或者编辑双字节值项“TaskbarGroupSize”并设置其值为欲设的窗口数量一般可为210左右。
12.设置当IE 6.0发生错误时是否允许错误报告
设置是否允许错误报告主要用于报告IE 6.0出现错误时将错误信息收集并通过Internet发送到微软技术部门通过下面的方法可以屏蔽此功能。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftInternet ExplorerMain新建或者编辑双字节值项“IEWatsonDisabled”并设置其值为0表示允许出现错误时报告1表示不报告。
13.让IE使用多线程下载网页
现在很流行Netants、FlashGet等多线程下载工具其实IE也可以使用多线程下载网页这样在设置适当的情况下可以加快网页下载速度。打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settings新建双字节值项“MaxConnectionsPerServer”此项的作用是决定最大同步下载的连线数目一般58个连线数目比较好。另外对于HTTP 1.0服务器可以加入名为“MaxConnectionsPer1_0Server”的双字节值项其值也是设置最大同步下载的数目。
14.设置Windows XP的DOS文件名风格
此设置用于控制是否允许在NTFS分区上使用DOS的8.3式的文件禁止这项功能将使NTFS分区的性能更高。打开注册表子键HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlFileSystem新建或者编辑双字节值项“NtfsDisable8dot3NameCreation”并设置其值0表示不允许1表示允许。
注意:对于一些十六位的安装程序将会自动使这项功能打开。
15.屏蔽/打开菜单阴影效果
Windows XP的阴影菜单效果确实更加个性化、绚丽但对于系统性能较低的机器此功能将消耗系统资源通过注册表可以屏蔽/打开此功能。打开注册表子键HKEY_CURRENT_USERControl PanelDesktop新建或者编辑已有二进制类型键值项“UserPreferencesMask”设置其值为将第二个二位改为“28”表示滚动效果表示屏蔽改为“3E”打开阴影效果。重新启动计算机后可看到效果。
16.打开无须登陆系统功能 此功能用于控制对于便携电脑的用户即便在没有登录时也有可以使用电脑。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPoliciesSystem新建或者编辑已有双字节值项“UndockWithoutLogon”并设置其值为0表示不允许有此功能1表示允许此功能。
17.设置“尚未阅读信息”的最大期限
Windows XP新功能包括在登录时显示几天内尚未阅读的新信息我们可以注册表里设置此最大期限。打开注册表子键如果仅仅应用于当前用户则打开“HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionUnreadMail”子键如果应用于所有用户则打开“HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionUnreadMail”子键新建或者编辑已有双字节值项“MessageExpiryDays”并设置其值为具体的天数。
18.隐藏/显示桌面图标
新的Windows XP外观更加个性化桌面似乎也变得更加简洁刚刚安装的系统桌面上仅仅只有一个“回收站”图标多少有点不方便其实默认情况下其他常用的图标如我的电脑、网上邻居等都被设置为隐藏我们可以通过注册表可以设置他们是否隐藏/显示。打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerHideDesktopIconsNewStartPanel新建下面所列对应的任何一个双字节值项
IE图标{20D04FE0-3AEA-1069-A2D8-08002B30309D}
回收站图标:{871C5380-42A0-1069-A2EA-08002B30309D}
网上邻居图标:{208D2C60-3AEA-1069-A2D7-08002B30309D}
我的文档图标:{450D8FBA-AD25-11D0-98A8-0800361B1103}
我的电脑图标:{645FF040-5081-101B-9F08-00AA002F954E}
并设置其值为1为隐藏相应图标0为显示相应图标。
19.显示/隐藏公共对话框中的“后退”按钮
Windows XP中可以调用功能更加强大、界面更加友好的新的公共对话框函数comdlg32.dll新的对话框中包含了“后退”这一方便的功能按钮但如果想隐藏它也可以通过注册表来设置。打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciescomdlg32新建或者编辑已有双字节值项“ NoBackButton”并设置其值为1为隐藏0为显示。
20.显示/隐藏公共对话框中的“查找范围快速定位区”
如上面说到的一样Windows XP公共对话框中的“查找范围”快速定位区也是可以隐藏/显示的。打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciescomdlg32新建或者编辑已有双字节值项“ NoPlacesBar”并设置其值为1为隐藏0为显示。
21.防止应用程序窗口失去焦点
如果当前的窗口被另一个自动运行的程序窗口覆盖即失去焦点在以往的Windows操作系统中特别是Windows 2000中常常因为窗口失去焦点致使窗口无法正常被控制。Windows XP中增加了对窗口焦点的操作功能具体可在注册表中设置。打开注册表子键HKEY_CURRENT_USERControl PanelDesktop新建或者编辑已有双字节值项“ForegroundLockTimeout”并设置其值如果是0则屏蔽锁定当前窗口焦点功能如果是具体的数字单位为毫秒则在等待设定的时间后自动释放被锁定的焦点。
然后在上面的子键下新建或者编辑已有双字节值项“ForegroundFlashCount”并设置其值如果是0则闪烁任务栏中的窗口直到单击后才停如果是具体的数字则当闪烁指定的次数后自动释放被锁定的焦点。
22.激活磁盘DMA66模式
激活磁盘系统DMA功能可以节省更多的CPU资源对磁盘进行操作通过注册表可以控制系统是否打开此功能。打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetControlClass{4D36E96A-E325-11CE-BFC1-08002BE10318}0000新建或者编辑已有双字节值项“EnableUDMA66”并设置其值0表示取消此功能1表示激活此功能。
23.锁定IE的下载功能
打开注册表子键HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersion Internet SettingsZones3新建或者编辑已有双字节值项“1803”并设置其值3表示锁定0表示不锁定。
24.禁止使用“LAST KNOW GOOD”(最后一次成功引导)
“LAST KNOW GOOD”最后一次成功引导可以在系统瘫痪时恢复到上一次运行正常时的状态如果出于需要而屏蔽此功能可以使用注册表来设置。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NT新建或编辑已有子键“ReportBootOk”并设置其值1为启用此功能0为屏蔽此功能。
25.控制发生错误时是否弹出警告窗口
默认情况下当应用程序发生严重错误被关闭时会弹出警告窗口并可以看到一些程序错误信息如果不想看到此警告弹出窗口可以在注册表里设置。打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetControlWindows新建或者编辑已有双字节值项“ErrorMode”并可设置键值为0所有错误都弹出显示“默认”1系统错误不显示应用程序错误显示2系统和应用程序同时发生错误则弹出显示。
26.控制当系统崩溃时是否记录日制
打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetControlCrashControl新建或者编辑已有双字节值项“LogEvent”并设置其值为0为不记录1为记录。
27.定制Regedit的收藏夹
Windows XP新版的Regedit增加了“收藏”功能但却没有管理收藏功能你只能创建、删除收藏而不能修改以及备份这些内容。
Regedit的“收藏”信息保存在HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionAppletsRegeditFavorites子键下键值项的名称就是显示在Regedit“收藏夹”里的条目而键值则是该条目指向的注册表子键路径比如“我的电脑HKEY_CURRENT_USERSoftwareMicrosoftWindows”。可根据自己的需求添加、删除、编辑修改这些项目。
28.启用“自动完成”功能
自动完成是Internet Explorer的一个体贴功能。此功能的妙处在于当你输入以前曾经输入过的地址时它会自动完成输入省去了反复输入的麻烦而特别是在地址很长的时候更能体现它的体贴入微。
Windows XP的一些命令输入窗口提供了类似的提示功能就是在你输入以前曾经输入的内容时它将其列出以备你选择使用但并不自动填充完成输入。很明显这一功能比“自动完成”还差那么一点人性化的体贴。打开HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerAutoComplete子键如果该子键下没有“Append Completion”键值项那么新建此键值项字符串型并赋值为“YES”自动完成功能便启用了。
29.自定义磁盘图标和卷标
通过在磁盘根目录下创建并设置Autorun.inf可以更改此磁盘的图标其实通过注册表的设置同样可以达到效果并且还可以自定义磁盘的卷标。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionExplorerDriveIcons如果没有DriveIcons子键请新建在该子键下新建一个与欲修改磁盘盘符相同名称的子键比如欲修改C盘那么新建一个以C为名的子键然后在其下新建一个用来设置磁盘图标的“DefaultIcon”子键并设置其默然值为图标文件的路径比如C:WindowsWelcome.exe或者其他图标文件。
用上面一样的方法再新建一个用来设置卷标的“DefaultLable”即…CDefaultLable子键并设置其默然值为欲设的卷标文字比如My Drive或其他文字。
以上操作完成后重新启动或者打开资源管理器并按F5刷新使修改生效。
30.为CD-ROM和磁盘驱动器建立高级安全机制
为CD-ROM和磁盘驱动器及其可移动介质建立高级安全机制可以只被当前登录的用户访问。具体可以按照如下步骤进行修改。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionWinlogon新建或者编辑已有字符串类型键值项AllocateCDRoms并设置其值为1可以使CD-ROM达到此功能0屏蔽此功能。
另外在该子键下还有键值项AllocateFloppies可以使磁盘驱动器达到此效果具体设置值与上面一样。
31.确定上次登录时用户使用的域
要控制用来确定成功登录到当前系统上一个用户所用域名的注册表项可以按照如下步骤进行操作。打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionWinlogon新建或修改已有字符串类型键值项“DefaultDomainName”其键值包含上一次成功登录时用户所用的域名。
32.Windows XP登录口令过期警告
要设置用来确定当用户登录且用户的口令已过期时是否显示警告对话框的注册表项可以打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsNTCurrentVersionWinlogon新建或者修改已有字符串值项“PasswordExpiryWarning”设置其值为在用户使用即将过期的口令进行登录时显示警告对话框所需的值。
33.防止用户配置文件选择对话框超时
要设置在连接远程服务器有一段延迟的情况下决定用户可以有多少时间确定使用本地配置文件还是服务器配置文件的注册表项可以打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon新建或者编辑已有字符串值项“ProfileDlgTimeOut”并设置其值为当连接远程服务器遇到延迟时允许用户在决定使用本地配置文件还是服务器配置文件时花费的时间毫秒
34.使用定制的Shell外壳程序
要设置用来指定作为Windows XP缺省Shell执行的程序的名称和路径的注册表项可以打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon新建或者编辑已有字符串型键值项“Shell”并设置其值改为想要使用的定制的Shell程序路径和程序文件名。
35.通过性能库防止可扩充计数器超时
你可能会遇到一个关于系统性能监视器的常见问题是图形或图表没有显示数据而你知道一个进程正在执行。这是由于几个原因造成但是最常见的原因是用来跟踪信息的可扩充计数器超时导致进程启动延迟。你可以通过如下所示的方法修改注册表来更正这个问题打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindowsCurrentVersionPerflib新建或编辑已有双字节值项“OpenProcedureWaitTime”并设置其值缺省值是5000ms毫秒即5秒将这个数值增加到一个合理的数值并再次试用系统性能监视器直到获取有效数据为止。
36.当资源管理器崩溃时强迫计算机重新启动
如果操作系统发生故障Windows XP就会自动重新启动。但是如果资源管理器崩溃桌面无法显示图标或任务栏那么你可能就必须使用键盘快捷键来注销并重新启动资源管理器。要避免出现这种情况可以打开注册表子键HKEY_LOCAL_MACHINESoftwareMicrosoftWindows NTCurrentVersionWinlogon新建或编辑已有双字节值项“AutoRestartShell”并设置其值为1为允许在资源管理器崩溃时自动重启0为强迫手工注销并重启。然后重新启动计算机下次资源管理器崩溃时计算机就会自动重启动而不必先注销再登录。
37.禁用Windows XP的文件高速缓存
一个与服务相关的注册表操作是增加信箱的可用缓存以防止丢失信件认识到这样做可能会对性能造成影响是很重要的只有当一个很明显的涉及信件丢失的问题无法用其他方法解决时才能这样做要做到这一点可以打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetServicesLanmanWorkstationParameters新建或者编辑已有双字节值项“UtilizeNtCaching”并设置其值为1为启用缓存0则禁止缓存。
38.设置系统临界线程的总数
打开注册表子键HKEY_LOCAL_MACHINESystemCurrentControlSetServicesLanmanWorkstationParameters新建或者编辑已有双字节值项“CriticalThreads”并设置其值为一个自己欲修改的值增加系统可用的临界线程数。