首页 > 技术文章 > 个人日记本

lcfwzq 2013-07-05 11:34 原文

15:16 2012-08-20 周一
返回本地主机的标准主机名。   
#include <Winsock2.h>   
int PASCAL FAR gethostname(char FAR *name, int namelen);  
 name: 一个指向将要存放主机名的缓冲区指针。  
 namelen:缓冲区的长度。
编辑本段注释:  该函数把本地主机名存放入由name参数指定的缓冲区中。
返回的主机名是一个以NULL结束的字符串。主机名的形式取决于
Windows Sockets实现-它可能是一个简单的主机名,或者是一个域名。
然而,返回的名字必定可以在gethostbyname()和WSAAsyncGetHostByName()中使用。

//-------------------------------------------
TrimLeft  
CString::TrimLeft   
void TrimLeft( );  
 void CString::TrimLeft( TCHAR chTarget );   
void CString::TrimLeft( LPCTSTR lpszTargets );   
参数: chTarget 要被整理的目标字符。   
lpszTargets 指向一个字符串的指针,该字符串包含了要被整理的目标字符。
 说明:   这个成员函数的没有参数的版本用来将字符串最前面的空格修整掉。当在没有参数的情况下调用时,TrimLeft删除换行符,空格和tab字符。   这个成员函数的需要参数的版本用来将一个特定的字符或一群特定的字符从字符串的开始处删除。
//--------------------------------------------
函数GetMessage 是 从调用线程的消息队列里取得一个消息并将其放于指定的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范围的消息值。GetMessage不接收属于其他线程或应用程序的消息。获取消息成功后,线程将从消息队列中删除该消息。函数会一直等待直到有消息到来才有返回值
//
Win7系统分区限制破解方法(主分区与逻辑分区的创建) 想必安装win7 已经不是什么新鲜的话题了!然而有安装过win7的朋友一定碰到过这样的问题 :win7安装程序创建的都是主分区,并没有创建逻辑分区的任何选项,这就造成了创建4个主分区后,剩余的空间无法继续分配的情况。面对这种问题,应该如何解决呢?其实,我们完全可以采用win7系统自带的Diskpart命令先进行分区,然后再进行系统的安装,这样做好处有三点:
首先:不用借助第三方工具;其次:不产生100MB的“系统保留”分区;最后:分区操作直接生效,不用重启计算机!Diskpart 是 Windows 环境下的一个命令,正常运行该命令时需要系统服务的支持,所以在纯DOs、XP内核的WinPE环境下都是不能运行的,但是在win7的预安装环境下确实可以运行的。
教程开始:
//------------------------------------------------------------------------------------------------------------------------
当安装程序运行到磁盘分区界面时,按下 “ Shift+F10 ”启动命令窗口;
然后输入 Diskpart 并回车,稍等便可进入 Diskpart的命令环境 (提示符为:DISKPART>),字此提示符下键入相应的命令便可完成磁盘的分区以及格式化操作,具体用到的命令有:List、Clean、 Select、Create、Format、Exit,各命令的使用方法可以通过键入Help查看,这里不再赘述!
<具体的操作流程看下 依次键入以下命令
List Disk / 显示本机的所有磁盘
Select Disk 0 / 选择0号磁盘(一个硬盘默认为0)
Clean / 清楚磁盘上所有的内容
Create Partition Primary Size=51200/ 创建主分区 容量为50G
Active / 激活主分区
Format Quick/ 快速格式化分区
Create Partition Extended/ 创建逻辑分区
Create Partition Logical Size=51200/ 创建逻辑分区一 容量为50G
Foramt Quick / 快速格式化分区
Create Partition Logical Size=153600 / 创建逻辑分区二 容量为150G
Foramt Quick/ 快速格式化分区
Create Partition Logical Size=153600/ 创建逻辑分区三 容量为150G
Foramt Quick / 快速格式化分区
Create Partition Logical/ 创建逻辑分区四 容量为剩余空间
Foramt Quick/ 快速格式化分区
/Exit/ 退出 Diskpart
/Exit / 退出命令提示符环境 /
--------------------------------------------Note:(右侧的红色文字为注释部分)--------------------------------------------

#pragma data_seg 建立一个新的数据段并定义共享数据,其格式为:
#prama data_seg()一般使用在DLL中,在DLL中定义一个共享的,有名字数据段
最关键的是这个数据段的全局变量可以被多个进程共享,否则 多个进程之间无法共享DLL中的全局变量。
共享数据必须初始化,否则微软编辑器会把没有初始化的数据放到BSS段中从而导致多个进程之间的共享行为失败
--------------------------------------------------------------------------------------------------
ZeroMemory(起始点,内存大小):将内存内部一段区域设置为0。
memset()内存清除,跨平台好。
------------------------------------------------------------
关于SetSystemPowerState(FALSE,TRUE);函数的调用有以下几个注意点
1.函数的功能是让windows系统进入休眠状态

2.执行该函数前必须满足系统设置了休眠开启状态 两种方式开启

(1)桌面右键/属性/桌面保护程序 选项卡/电源.../休眠 选项卡/休眠

(2)控制面板/电源选项/休眠 选项卡/休眠

3.能开启睡眠必须满足的条件是 你的系统盘剩余空间大小>物理内存大小

4.要调用AdjustTokenPrivileges函数 获取系统的权限先
---------------------------------------------------------------------------------------------------
HOWTO: InstallShield中如何实现MSI包的权限提升
2010-12-06 10:36 by Kevin.Wan, 2052 阅读, 1 评论, 收藏, 编辑

大家都清楚Vista和Windows 7的UAC问题,安装包中我们可以通过权限提提升获得系统操作权限。

如果是Setup.exe形式的安装包,我们在InstallShield工程中是通过如下方式实现安装包权限提升的:

Release视图 -> Setup.exe选项卡 -> 将 Required Execution Level 属性设为Administrator。
如果是单个MSI包,我们如何实现权限提升呢?

Installation Information -> General Information -> Summary Information Stream, 将 Require Administrative Privileges 属性设为Yes
但要注意,上述方法只限于Windows Installer 4.0和更高版本,Windows Vista,Server 2008 R1/R2和Windows 7系统。Windows Installer版本与Windows系统对应关系见Wikipedia中的介绍:http://en.wikipedia.org/wiki/Windows_Installer
版权声明: 转载时请务必以超链接形式标明文章原始出处和作者信息。
--------------------------------------------------------------------------------------------------------
lcfwzq@live.cn lcf32747755wzq

待机是这个命令吧?%windir%\system32\rundll32.exe powrprof.dll,SetSuspendState
system("rundll32.exe powrprof.dll,SetSuspendState");待机命令
-----------------------------------------------------------------------------------------------------------
11:04 2012-09-12
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int main( void )
{
FILE *fp;
fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件
assert( fp ); //所以这里不会出错
fclose( fp );

fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败
assert( fp ); //所以这里出错
fclose( fp ); //程序永远都执行不到这里来
return 0;
}
使用断言

assert()宏是用于保证满足某个特定条件,用法是:

assert(表达式);

如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。

使用这个宏前需要包含头文件assert.h

例如

#include <stdio.h>
#include <assert.h>

void main()
{
float a,b;
scanf("%f %f",&a,&b);
assert(b!=0);
printf("%f\n",a/b);
}

以上的程序要计算A/B的值,因此要求b!=0,所以在程序中使用了assert()用于确保b!=0,如果b==0,则程序会退出。
---------------------------------------------------------------------------------------------------------
11:15 2012-09-13:
frame框架结构 capture捕获 epoch时间点 previous先前过早的 reference设计参考证明书 ignore忽略不理睬
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
//----------------------------------------------------------------------
debug 执行的时候报错:那个变量没有初始化,直接找到那个变量修改就可以了。
//--------------------------------------------------------------------------------------
15:13 2012-11-08
 因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。
简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,
以便该函数在处理相似事件的时候可以灵活的使用不同的方法。
//--------------------------------------------------------------------------------
16:11 2012-11-13
CString Mid(int nFirst,int nCount)const;
nCount 代表要提取的字符数,nFirst代表要提取的开始索引位置 例子:
CString s(_T("abcdef"));
ASSERT(s.MID(2,3))==_T("cbe"));从字符串s中获取从2位置开始获取3个字符。
//----------------------------------------------------------------
10:51 2012-11-14
int nselect=m_combobox.GetCurSel(); //获取当前组合框选项的索引
CString szname;
m_combobox.GetLBText(nselect,szname); //获取组合框里的标题内容
或者
CString Str; GetDlgItemText(IDC_COMBOBOX1,Str);//IDC_COMBOBOX1为你控件的ID
//---------------------------------------------------------
15:14 2012-11-20
shellexecute的返回值
如果返回值 <= 32, 表示执行错误
0 内存不足
2 文件名错误
3 路径名错误
11 EXE 文件无效
26 发生共享错误
27 文件名不完全或无效
28 超时
29 DDE 事务失败
30 正在处理其他 DDE 事务而不能完成该 DDE 事务
31 没有相关联的应用程序

ShellExecute(NULL,"open","c:\\QQ.exe",NULL,NULL,SW_SHOWNORMAL);

//----------------------------------------------
15:51 2012-11-22
ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);
//显示隐藏
WINDOWPLACEMENT wp;
wp.length=sizeof(WINDOWPLACEMENT);
wp.flags=WPF_RESTORETOMAXIMIZED;
wp.showCmd=SW_HIDE;
SetWindowPlacement(&wp);


//--------------------------------------------
c++里面设置控件的函数及方法BOOL CMy54_s1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
/*添加初始化代码*/
//初始化输入框
((CEdit*)GetDlgItem(IDC_EDIT_TEST))->SetWindowText("this is a edit box");
//初始化列表框
CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST);
pListB->AddString("item 1");
pListB->AddString("item 2");
pListB->AddString("item 3");
//初始化组合框
CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST);
pCB->AddString("item 1");
pCB->AddString("item 2");
pCB->AddString("item 3");
//初始化Tab Ctrl
CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST);
pTab->InsertItem(0,"Tab Page1");
pTab->InsertItem(1,"Tab Page2");
pTab->InsertItem(2,"Tab Page3");
//初始化ListCtrl
CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL);
pList->InsertColumn(0,"Column 1",LVCFMT_LEFT,100);
pList->InsertItem(0,"Item 1");
pList->InsertItem(1,"Item 2");
pList->InsertItem(2,"Item 3");
//初始化TreeCtrl
CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST);
pTree->InsertItem("Node1",0,0);
HTREEITEM hNode=pTree->InsertItem("Node2",0,0);
pTree->InsertItem("Node2-1",0,0,hNode);
pTree->InsertItem("Node2-2",0,0,hNode);
pTree->Expand(hNode,TVE_EXPAND);

return TRUE; // return TRUE unless you set the focus to a control
}

好,自己来总结一下,总的来说,每一个控件都是用一个指针对象来控制的(什么都是指针,怪不得c++这么容易发生内存泄露)

CListBox* pListB=(CListBox*)GetDlgItem(IDC_LIST_TEST);
CComboBox* pCB=(CComboBox*)GetDlgItem(IDC_COMBO_TEST);
CTabCtrl* pTab=(CTabCtrl*)GetDlgItem(IDC_TAB_TEST);
CListCtrl* pList=(CListCtrl*)GetDlgItem(IDC_LIST_CTRL);
CTreeCtrl* pTree=(CTreeCtrl*)GetDlgItem(IDC_TREE_TEST);

不难看出,任何要操作控件的时候都是先实例化一个指向这个控件的指针,其实GetDlgItem这个方法就是指向指针的,但是是指向父类类型CWnd的(个人猜测,还没有来得及去查MSDN),所以每次都需要强制转换成自己类型的指针。

然后用属于这个指针的方法来调用这些函数来实现最基本的mfc控件编程(完全没有.net的灵活性,不过只要熟悉了应该还是没有什么大的问题了)呵呵
//---------------------------------------
10:55 2012-11-26
2012-08-16 14:32 226人阅读 评论(0) 收藏 举报
CComboBox使用技巧:
--------------------------------------------------------------------------------

1. CComboBox风格


CBS_AUTOHSCROLL //自动水平滚动条
CBS_DISABLENOSCROLL //选中时始终显示滚动条
CBS_DROPDOWN //下拉式
CBS_DROPDOWNLIST //下拉列表
CBS_HASSTRINGS //为字符串提供GetText()函数
CBS_LOWERCASE //转换为小写
CBS_NOINTEGRALHEIGHT //指定组合框由应用程序来指定大小的
CBS_OEMCONVERT //OEM字符集转换
CBS_OWNERDRAWFIXED //所有项目的高度是一样的
CBS_OWNERDRAWVARIABLE //指定单一项目的高度
CBS_SIMPLE //简单风格
CBS_SORT //排序
CBS_UPPERCASE //转换为大写
CBS_AUTOHSCROLL //自动水平滚动条
CBS_DISABLENOSCROLL //选中时始终显示滚动条
CBS_DROPDOWN //下拉式
CBS_DROPDOWNLIST //下拉列表
CBS_HASSTRINGS //为字符串提供GetText()函数
CBS_LOWERCASE //转换为小写
CBS_NOINTEGRALHEIGHT //指定组合框由应用程序来指定大小的
CBS_OEMCONVERT //OEM字符集转换
CBS_OWNERDRAWFIXED //所有项目的高度是一样的
CBS_OWNERDRAWVARIABLE //指定单一项目的高度
CBS_SIMPLE //简单风格
CBS_SORT //排序
CBS_UPPERCASE //转换为大写
CBS_AUTOHSCROLL //自动水平滚动条
CBS_DISABLENOSCROLL //选中时始终显示滚动条
CBS_DROPDOWN //下拉式
CBS_DROPDOWNLIST //下拉列表
CBS_HASSTRINGS //为字符串提供GetText()函数
CBS_LOWERCASE //转换为小写
CBS_NOINTEGRALHEIGHT //指定组合框由应用程序来指定大小的
CBS_OEMCONVERT //OEM字符集转换
CBS_OWNERDRAWFIXED //所有项目的高度是一样的
CBS_OWNERDRAWVARIABLE //指定单一项目的高度
CBS_SIMPLE //简单风格
CBS_SORT //排序
CBS_UPPERCASE //转换为大写

 

--------------------------------------------------------------------------------

2. 初始化数据

1).在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。换行用ctrl+回车。


2).在程序初始化时动态添加


((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);//strTemp为CString
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);//strTemp为CString
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->AddString(strTemp);//strTemp为CString

 


--------------------------------------------------------------------------------

3. 删除指定行


DeleteString( UINT nIndex ) //删除指定行
DeleteString( UINT nIndex ) //删除指定行
DeleteString( UINT nIndex ) //删除指定行

 


--------------------------------------------------------------------------------


4.插入指定位置


InsertString( int nIndex, LPCTSTR lpszItem ) //将行插入到指定位置
InsertString( int nIndex, LPCTSTR lpszItem ) //将行插入到指定位置
InsertString( int nIndex, LPCTSTR lpszItem ) //将行插入到指定位置

 


--------------------------------------------------------------------------------


5.删除所有项


((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除ID为IDC_COMBO_CF现有所有内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除ID为IDC_COMBO_CF现有所有内容
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->ResetContent(); //消除ID为IDC_COMBO_CF现有所有内容

 

--------------------------------------------------------------------------------

6.查找指定字符串


FindString( int nStartAfter, LPCTSTR lpszItem ) //可以在当前所有行中查找指定的字符串的位置,nStartAfter指明从那一行开始进行查找。
SelectString( int nStartAfter, LPCTSTR lpszItem ) //可以选中包含指定字符串的行
FindString( int nStartAfter, LPCTSTR lpszItem ) //可以在当前所有行中查找指定的字符串的位置,nStartAfter指明从那一行开始进行查找。
SelectString( int nStartAfter, LPCTSTR lpszItem ) //可以选中包含指定字符串的行
FindString( int nStartAfter, LPCTSTR lpszItem ) //可以在当前所有行中查找指定的字符串的位置,nStartAfter指明从那一行开始进行查找。
SelectString( int nStartAfter, LPCTSTR lpszItem ) //可以选中包含指定字符串的行

 


--------------------------------------------------------------------------------


7.选择其中某行


//(1)选中:
int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
//(2)设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。
//(1)选中:
int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
//(2)设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。
//(1)选中:
int iPos=((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetCurSel(); //当前选中的行。
//(2)设置
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->SetCurSel(n) //设置第n行内容为显示的内容。

 


--------------------------------------------------------------------------------


8.获取总行数


int GetCount()//得到当前列表框中行的数量
int GetCount()//得到当前列表框中行的数量
int GetCount()//得到当前列表框中行的数量

 

--------------------------------------------------------------------------------


9.取得Combo Box框内容


/*(1)取当前内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp); //将获取的值存放到CString类型变量strTemp中。
//如果定义了关联的变量,例如m_combo,可以直接获取:m_combo->GetWindowText(strTemp);
/*(2)取其他行内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp); //其中n为从0开始的索引值 /*(1)取当前内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp); //将获取的值存放到CString类型变量strTemp中。

//如果定义了关联的变量,例如m_combo,可以直接获取:m_combo->GetWindowText(strTemp);
/*(2)取其他行内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp); //其中n为从0开始的索引值
/*(1)取当前内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetWindowText(strTemp); //将获取的值存放到CString类型变量strTemp中。

//如果定义了关联的变量,例如m_combo,可以直接获取:m_combo->GetWindowText(strTemp);
/*(2)取其他行内容*/
((CComboBox*)GetDlgItem(IDC_COMBO_CF))->GetLBText(n,strTemp); //其中n为从0开始的索引值

 


--------------------------------------------------------------------------------


10.获得焦点

通常要判断控件是否获得了焦点,可以用GetFocus()函数
例如:if(GetFocus()==GetDlgItem(IDC_EDIT_VALUE2))//判断焦点是否在编辑框IDC_EDIT_VALUE2内。
但是combobox 的焦点不同,因为它是由edit和listbox两部分组成的,所以获得焦点要用GetParent():


if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))
if ((GetFocus()->GetParent())==GetDlgItem(IDC_COMBO_CF))

 


--------------------------------------------------------------------------------


11.改变下拉框大小

在设计界面里,点击一下Combo Box的下拉箭头,此时出现的调整框就是Combo Box的下拉调整框


--------------------------------------------------------------------------------

12.常用消息映射宏

ON_CBN_DBLCLK 鼠标双击
ON_CBN_DROPDOWN 列表框被弹出
ON_CBN_KILLFOCUS / ON_CBN_SETFOCUS 在输入框失去/得到输入焦点时产生
ON_CBN_SELCHANGE 列表框中选择的行发生改变
ON_CBN_EDITUPDATE 输入框中内容被更新
使用以上几种消息映射的方法为定义原型如:afx_msg void memberFxn( );的函数,并且定义形式如ON_Notification( id, memberFxn )的消息映射。
如果在对话框中使用组合框,Class Wizard会自动列出相关的消息,并能自动产生消息映射代码。
//-------------------------------------------
if ((int nIndex=m_cbo.FindStringExact(-1, "Roy Chou")) != CB_ERR)
{
m_cbo.SetCurSel( nIndex );
} //用FindString会出现问题。它只是查找前面匹配的字符,而不是完全相同的字符。
SendMessage(
(HWND) hWnd, // handle to destination window
CB_GETLBTEXT, // message to send
(WPARAM) wParam, // item index
(LPARAM) lParam // receives string (LPCSTR)
);
///---------------------------
9:20 2012-12-19
在子窗口添加初始化函数
在vc对话框的操作中,很多资料上都讲到可以使用虚函数OnInitDialog()对其进行初始化。但是在类的添加虚函数的列表中,并没有这个函数。这是怎么回事呢?事实上,在消息框里面有一个 WM_INITDIALOG 消息,添加这个消息,则自动添加了一个OnInitDialog()函数。这样就可以对对画框进行初始化了
//------------------------------------
在菜单[(视图)view]里有(类视图)和(属性管理器)两个命令,点选他们主窗口就显示这两个视图了,类视图上选中对话框那个类,属性视图跟着改变了,属性视图上有六个按钮,点第六个按钮就显示了所有该类可以重载的函数,找到对应的消息即可添加函数。选择重写,里面就有需要重写的初始化函数。搞定
//--------------------------------------------------------------------------------
2010-01-05 19:28 regini设置注册表权限 Regini是一个设置注册表权限的安全工具,常用于命令行方式批量更改注册表权限来达到提高系统安全性,下面我们先看看regnin所对应的格式和权限数值。
命令格式 renini.ini的格式:

注册表键数值 [更改的权限]

注册表中对应的权限代码:

1 - Administrators 完全访问
2 - Administrators 只读访问
3 - Administrators 读和写入访问
4 - Administrators 读、写入、删除访问
5 - Creator 完全访问
6 - Creator 读和写入访问
7 - everyone 完全访问
8 - everyone 只读访问
9 - everyone 读和写入访问
10 - everyone 读、写入、删除访问
11 - Power Users 完全访问
12 - Power Users 读和写入访问
13 - Power Users 读、写入、删除访问
14 - System Operators 完全访问
15 - System Operators 读和写入访问
16 - System Operators 读、写入、删除访问
17 - System 完全访问
18 - System 读和写入访问
19 - System 只读访问
20 - Administrators 读、写、执行访问
21 - Interactive User 完全访问
22 - Interactive User 读和写入访问
23 - Interactive User 读、写入、删除访问

例子:我们要设置常见的3个组的用户为只读权限.那么先新建一个文件名为regini.ini然后编辑regini.ini的内容如下:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run [2 8 19]
然后保存regini.ini 在命令行下导入regini.ini的命令是:regini regini.ini
//17:38 2013-01-04----------------------------
2011-06-16 15:12 用API使计算机休眠或待机Private Declare Function SetSuspendState Lib "Powrprof" (ByVal Hibernate As Boolean, ByVal ForceCritical As Boolean, ByVal DisableWakeEvent As Boolean) As Boolean

示例:
SetSuspendState True, True,True

'参数Hibernate: =False:待机; =True:休眠
'参数ForceCritical: =False:不强行中止运行中的进程; =True:强行中止运行中的进程
'参数DisableWakeEvent =False:允许系统事件唤醒计算机; =True:系统不能唤醒计算机

如果函数成功,返回值为非零。
如果函数失败,返回值为零。为了获得更多的错误信息,调用GetLastError。
备注
//-------13:25 2013-01-31\
原文地址《MFC程序隐藏任务栏图标的三种方法 》
  在VC编程中,有时候我们需要将我们的程序在任务栏上的显示隐藏起来,我试过几种方法,下面我介绍一下我知道的三种方法。

  第一种方法是设置窗口WS_EX_TOOLWINDOW扩展样式,通过在OnInitDialog函数中添加如下代码:

  ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);

  ModifyStyleEx函数原型如下:

    BOOL ModifyStyleEx(
     DWORD dwRemove,
     DWORD dwAdd,
     UINT nFlags = 0 );

  第一个参数是要被去掉的扩展样式,如果设为0或NULL,则不去除任何样式;第二个参数类似,设置要添加的扩展样式;第三个参数默认为0,表示不调用SetWindowPos函数,如果设为true或非0,表示之后会调用SetWindowPos函数。上述代码为窗口添加了WS_EX_TOOLWINDOW样式,同时去掉了WS_EX_APPWINDOW样式,你可理解为这个窗口被设置成工具窗口,类似工具条。运行后效果如下
//------------------------------------
10:23 2013-03-20
大家知道,MFC框架没有提供任何现成的类应用于系统托盘UI,那么如何将表示应用程序的图标添加到任务栏中呢?方法很简单,只用到一个API函数,它就是Shell_NotifyIcon。这个函数本身也相当容易理解和使用。看看它的原型就知道了:
BOOL Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid );
第一个参数dwMessage类型为DWORD,表示要进行的动作,它可以是下面的值之一:
NIM_ADD: 添加一个图标到任务栏。
NIM_MODIFY: 修改状态栏区域的图标。
NIM_DELETE: 删除状态栏区域的图标。
NIM_SETFOCUS: 将焦点返回到任务栏通知区域。
当完成用户界面操作时,任务栏图标必须用此消息。例如,如果任务栏图标正显示上下文菜单,但用户按下"ESCAPE"键取消操作,这时就必须用此消息将焦点返回到任务栏通知区域。
NIM_SETVERSION:指示任务栏按照相应的动态库版本工作。
第二个参数pnid是NOTIFYICONDATA结构的地址,其内容视dwMessage的值而定。这个结构在SHELLAPI.H文件中定义如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; // 结构大小(sizeof struct),必须设置
HWND hWnd; // 发送通知消息的窗口句柄
UINT uID; // 图标ID ( 由回调函数的WPARAM 指定)
UINT uFlags;
UINT uCallbackMessage; // 消息被发送到此窗口过程
HICON hIcon; // 图标句柄
CHAR szTip[64]; // 提示文本
} NOTIFYICONDATA;
uFlags的值:
#define NIF_MESSAGE 0x1 // 表示uCallbackMessage 有效
#define NIF_ICON 0x2 // 表示hIcon 有效
#define NIF_TIP 0x4 // 表示szTip 有效
有关Shell_NotifyIcon函数的详细使用细节请参考MSDN。
NOTIFYICONDATA结构中的 hWnd 是"拥有" 图标的窗口句柄。uID可以是任何标示托盘图标的ID(如果有多个图标),一般使用资源ID。HIcon可以是任何图标的句柄,包括预定义的系统图标,如IDI_HAND、IDI_QUESTION、IDI_EXCLAMATION、或者Windows的徽标IDI_WINLOGO。
图标的显示并不难,关键是事件的处理。 当用户将鼠标移到图标上或者在图标上单击鼠标时,为了得到通知消息,你可以将自己的消息ID赋给uCallbackMessage,并设置NIF_MESSAGE标志。当用户在图标上移动或单击鼠标时,Windows将用hWnd指定的窗口句柄调用你建立的窗口过程;消息ID在uCallbackMessage中指定,uID的值即为wParam,lParam为鼠标事件,如WM_LBUTTONDOWN等。
尽管Shell_NotifyIcon函数简单实用。但它毕竟是个Win32 API,为此我将它封装在了一个C++类中,这个类叫做CTrayIcon,有了它,托盘编程会更加轻松自如,因为它隐藏了NOTIFYICONDATA、消息代码、标志以及所有那些你必须要看MSDN才能搞掂的繁琐细节。CTrayIcon的定义以及实现细节请下载源代码参考。CTrayIcon为程序员提供了一个更加友好的托盘编程接口,它除了对Shell_NotifyIcon函数进行打包之外,它还是一个迷你框架呢!之所以这么说,是因为按照Windows系统应用软件界面指南所提倡的原则(这个指南可以在MSDN中找到),这个类增强了托盘图标的用户界面行为。以下便是CTrayIcon最终实现的UI特性:
1、 托盘图标应该有信息提示,也就是ToolTips。
2、 单击右键应该弹出上下文菜单,这个菜单中应包含打开属性页的命令或者打开与图标相关的其它窗口的命令。
3、 单击左键应该显示进一步的信息或者控制图标所代表的对象,例如,当左键单击声音图标时进行音量控制。如果没有进一步的信息或控制,则不要有任何动作。
CTrayIcon对上面的特性进行了全面的封装。为了示范CTrayIcon的工作原理,本文提供一个例子程序TrayTest1,图一是运行程序后显示的一个对话框
//----------------------------------------------------
10:41 2013-03-20
GetSafeHwnd当我们想得到一个窗口对象(CWnd的派生对象)指针的句柄(HWND)时,最安全的方法是使用GetSafeHwnd()函数,通过下面的例子来看其理由:
CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器
HWND hwnd = pwnd->m_hwnd; //得到它的HWND
这样的代码当开始得到的pwnd为空的时候就会出现一个“General protection error”,并关闭应用程序,因为一般不能对一个NULL指针访问其成员,如果用下面的代码:
CWnd *pwnd = FindWindow(“ExploreWClass”,NULL); //希望找到资源管理器
HWND hwnd = pwnd->GetSafeHwnd(); //得到它的HWND
就不会出现问题,因为尽管当pwnd是NULL时,GetSafeHwnd仍然可以用,只是返回NULL,通过GetSafeHwnd()的实现代码就更清楚了:
_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
{
return this == NULL?NULL:m_hWnd;
}
你看有很多函数的参数要求HWND,它就可以派上用场了.
HWND hwnd;
CWnd* pWnd;
pWnd=((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView();
hwnd=pWnd->GetDlgItem(IDC_EDIT2)->GetSafeHwnd();
::SetWindowText(hwnd,m_strResult);
//----------------------------------------------------
10:20 2013-03-21
FlashWindow函数原型:
Declare Function FlashWindow Lib "user32" Alias "FlashWindow" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
函数说明:
闪烁显示指定窗口。这意味着窗口的标题和说明文字会发生变化,似乎从活动切换到非活动状态、或反向切换。通常对不活动的窗口应用这个函数,引起用户的注意
返回值:
Long,如窗口在调用前处于活动状态,则返回TRUE(非零)。
参数,类型及说明:
hwnd:Long,要闪烁显示的窗口的句柄。
bInvert:Long,TRUE(非零)表示切换窗口标题;FALSE返回最初状态。
注解:
该函数通常与一个计数器组合使用,生成连续的闪烁效果。在windows nt及windows for workgroup中,bInvert参数会被忽略。但在windows 95中不会忽略。
//-----------------------------------------------------------
//获取联网状态
int check_net(void)
{
int fd;
int in_len=0;
struct sockaddr_in servaddr;
//char buf[128];

in_len = sizeof(struct sockaddr_in);
fd = socket(AF_INET,SOCK_STREAM,0);
if(fd < 0)
{
perror("socket");
return -1;
}

/*设置默认服务器的信息*/
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(NET_PORT);
servaddr.sin_addr.s_addr = inet_addr(NET_IP);
memset(servaddr.sin_zero,0,sizeof(servaddr.sin_zero));

/*connect 函数*/
if(connect(fd,(struct sockaddr* )&servaddr,in_len) < 0 )
{

printf("not connect to internet!\n ");
close(fd);
return 0; //没有联网成功
}
else
{
printf("=====connect ok!=====\n");
close(fd);
return 1;
}
}

推荐阅读