1。vc-打印源码中文件名和行号常用的宏名什么?
文件名:__FILE__ 行号:__LINE__
2。vc-限制Edit只能输入0-F
WNDPROC wpOrigEditProc;
LRESULT CALLBACK wpSubclassEditProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam);
wpOrigEditProc = (WNDPROC) SetWindowLong(GetDlgItem(IDC_EDIT_DATA)->m_hWnd,
GWL_WNDPROC, (LONG) wpSubclassEditProc);
LRESULT CALLBACK wpSubclassEditProc(HWND hDlg,UINT uiMsg,WPARAM wParam,LPARAM lParam)
{
switch(uiMsg)
{
case WM_CHAR:
if((wParam >= 0x30 && wParam <= 0x39) ||
(wParam >= 0x41 && wParam <= 0x46) ||
(wParam >= 0x61 && wParam <= 0x66) ||
(wParam == 0x08) || wParam == 0x20 || wParam == 0x0D)
{
return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
}
else
{
if(GetKeyState(VK_CONTROL) & 0x8000)
{
return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
}
return true;
}
break;
}
return CallWindowProc(wpOrigEditProc,hDlg,uiMsg,wParam,lParam);
}
3.修改文件扩展名函数,PathRenameExtension,msdn还有以Path打头的其他函数,如PathRemoveFileSpec(去掉文件名,保留路径)等
4.添加ToolTips
//API方式
TOOLINFO ti;
hwndTT = CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASS,NULL,
WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP |
WS_EX_TOOLWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
hwnd,NULL,/*ghInstance*/NULL,NULL);
GetClientRect (GetDlgItem(hwnd,IDC_BTN_TOOLTIP), &rect);
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_SUBCLASS;
ti.hwnd = GetDlgItem(hwnd,IDC_BTN_TOOLTIP);
ti.hinst = ghInstance;
ti.uId = IDC_BTN_TOOLTIP;
ti.lpszText = "Button Tool Tip String";
// ToolTip control will cover the whole window
ti.rect.left = rect.left;
ti.rect.top = rect.top;
ti.rect.right = rect.right;
ti.rect.bottom = rect.bottom;
/* SEND AN ADDTOOL MESSAGE TO THE TOOLTIP CONTROL WINDOW */
SendMessage(hwndTT, TTM_ADDTOOL, 0, (LPARAM)&ti);
//mfc方式
1, 对话框类添加成员:
CToolTipCtrl m_ToolTips;
2, 在对话框 OnInitialUpdate 中添加
m_ToolTips.Create(this);
m_ToolTips.AddTool(GetDlgItem(IDC_MY_COMBO_BUTTON_XXX),TEXT("This is tooltip"));
3, 在对话框类的 PreTranslateMessage(MSG* pMsg)
添加
switch(pMsg-> message)
{
case WM_MOUSEMOVE:
m_ToolTips.RelayEvent(pMsg);
break;
}
5.第一个问题:
console程序如果禁止用户点击右上角的X关闭?如何禁止用户使用Ctrl+C或者Ctrl+Break关闭?
SetConsoleCtrlHandler来设置Ctrl+C的句柄.
第二个问题:
使用printf显示到console上的字符,最多只能显示300行,如果可以增加这个数值或者是不限制?
用SetConsoleScreenBufferSize更改缓冲区大小.
6.获取动态库本身路径!
GetModuleFileName(NULL, buf, MAX_PATH); 取的是exe的路径
GetModuleFileName的第一个参数用Dll的句柄就可以取Dll的路径
dll的句柄从DllMain中得到,然后调用GetModuleFileName
7.如何在动态库中能调用主程序中的函数
dll的头文件里
typedef void (__stdcall *PFN_MYCALLBACK)(char *);
XXX_API void __stdcall SetCallbackFun(PFN_MYCALLBACK pCallbackFun);
调用者的cpp文件里
void __stdcall CallbackFunction(char *strResult)
{
.....
}
SetCallbackFun(CallbackFunction);
8.如何枚举WINXP已登录的帐户
BOOL GetLogUserXP(HANDLE hServer, DWORD dwSessionID, CString& strName)
{
BOOL bRet = FALSE;
strName = _T( " ");
//for xp or above
TCHAR *szLogName = NULL;
DWORD dwSize = 0;
if (WTSQuerySessionInformation(hServer,
dwSessionID,
WTSUserName,
&szLogName,
&dwSize))
{
strName = szLogName;
WTSFreeMemory(szLogName);
bRet = TRUE;
}
return bRet;
}
void CLKTestDlg::OnBnClickedButton12()
{
HANDLE hServer;
hServer = WTSOpenServer(NULL);
WTS_SESSION_INFO *si;
DWORD dwSiCount;
CString strUserName;
if(hServer)
{
WTSEnumerateSessions(hServer,0,1,&si,&dwSiCount);
for(int i = 0; i < dwSiCount; i++)
{
//AfxMessageBox(si[i].pWinStationName);
if(GetLogUserXP(hServer, si[i].SessionId, strUserName))
{
AfxMessageBox(strUserName);
}
}
}
WTSFreeMemory(si);
WTSCloseServer(hServer);
}
}
9.为什么ON_COMMAND_RANGE事件会被VC自动从 message map中移除
不要把这些宏写进 afx_msg 区域内,否则每次利用 ClassWizard 添加新的类或重载函数时,ClassWizard 会把 ON_COMMAND_RANGE当作不规范的语法删除。
10.如何具体判断一个字符串中哪个是英文字母
函数isalpha
11.在注册表中如何得到所有安装了的应用程序程序的信息
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall
下面的子鍵
12.vista64下操作注册表遭遇重定向问题
PVOID OldValue;
HINSTANCE hlibrary;
typedef int (__stdcall * Wow64DisableWow64FsRedirection)(LPVOID);
YWow64DisableWow64FsRedirection f_Wow64DisableWow64FsRedirection = NULL;
typedef int (__stdcall * Wow64RevertWow64FsRedirection)(LPVOID);
Wow64RevertWow64FsRedirection f_Wow64RevertWow64FsRedirection = NULL;
hlibrary = LoadLibrary("Kernel32.dll");
f_Wow64DisableWow64FsRedirection = (Wow64DisableWow64FsRedirection) GetProcAddress(hlibrary,"Wow64DisableWow64FsRedirection");
if(!f_Wow64DisableWow64FsRedirection)
{
}
f_Wow64DisableWow64FsRedirection (&OldValue);
//这里写注册表操作函数,Open的时候要指定 KEY_WOW64_64KEY标志
f_Wow64RevertWow64FsRedirection = (Wow64RevertWow64FsRedirection) GetProcAddress(hlibrary,"Wow64RevertWow64FsRedirection");
if(!f_Wow64RevertWow64FsRedirection)
{
}
f_Wow64RevertWow64FsRedirection (OldValue);
FreeLibrary(hlibrary);
13.多线程 事件激发问题
在Windows下你可以使用CreateEvent来创建一个事件。如果你为这个事件指定名字,那么如果操作系统中没有同样名字事件的话,会创建一个有名字的事件,否则会返回一个现存事件的句柄。你也可以用OpenEvent来访问一个现存的事件。关于事件的触发和响应,参考Using Event Objects
14.怎么使用系统默认浏览器在新窗口打开网页
CString args;
args.Format(_T("url.dll,FileProtocolHandler %s"), lpszURL);//此方法得不到错误返回代码
HINSTANCE result = ShellExecute(NULL, _T("open"), _T("rundll32.exe"), args, NULL, SW_SHOWNORMAL);
return result;
ps:
ShellExecute是我们常用的一个API,可以运行程序,打开网页。
ShellExecute(NULL, "open", "http://www.youkuaiyun.com", NULL,NULL,SW_SHOWMAXIMIZED);
这样可以打开一个网页,但不是在新IE中打开,改成下面方式时就可以在一个新的IE中打开网页了
ShellExecute(NULL, "open", "IEXPLORE", "http://www.youkuaiyun.com", NULL,SW_SHOWMAXIMIZED);
15.怎么清除串口的输入缓冲啊
PurgeComm(hCom,PURGE_TXABORT ¦ PURGE_RXABORT ¦ PURGE_TXCLEAR ¦ PURGE_RXCLEAR );
16.判断出当前系统是xp x64还是server 2003 x64
第一加载Kernel32.dll中的文件重定向函数,如果失败则说明是32位系统,成功则说明是64系统,但是存在函数实际存在但加载失败的情况,虽然估计这种情况比较少见
第二步是读注册表HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/ProductName来判断系统
17.知道进程ID,如何获取此进程对应的主窗口的Title
定义一个回调函数,用EnumWindows来枚举窗口,GetWindowThreadProcessId获得窗口进程ID,匹配的话则读取窗口caption
18.delphi 中存在重名的情况下,如何再类中引用全局变量
使用单元名加变量就可以了
19.为什么通过GetParent()访问不到对话框所属的视类?
子窗口是不可以作为Dialog的父窗体的,至少MFC中是不能。
// a popup window cannot be owned by a child window
while (hWnd != NULL && (::GetWindowLong(hWnd, GWL_STYLE) & WS_CHILD))
hWnd = ::GetParent(hWnd);
如果想获得Dialog的父窗体,请使用Dialog::m_pParentWnd。
20.如何获得USB设备的Product ID,Vendor ID等信息
#include <stdio.h> #include <windows.h>
#include <Setupapi.h>
#include <InitGuid.h>//这句话很重要,否则链接的时候出错!
//GUID GUID_CLASS_I82930_BULK;
/////
// {6068EB61-98E7-4c98-9E20-1F068295909A}
DEFINE_GUID(GUID_CLASS_I82930_BULK,
0x394fe679, 0xe65f, 0x4eab, 0x8d, 0x30, 0xe8, 0x9d, 0xbf, 0x6a, 0x4a, 0x89);
BOOL GetHardwareIDByInterfaceGUID(GUID* pGuid, DWORD instance,char* buffer,int bufferSize)
{
// Get handle to relevant device information set
HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if(info==INVALID_HANDLE_VALUE)
{
printf("No HDEVINFO available for this GUID/n");
return FALSE;
}
// Get interface data for the requested instance
SP_INTERFACE_DEVICE_DATA ifdata;
ifdata.cbSize = sizeof(ifdata);
if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata))
{
printf("No SP_INTERFACE_DEVICE_DATA available for this GUID instance/n");
SetupDiDestroyDeviceInfoList(info);
return FALSE;
}
SP_DEVINFO_DATA did = {sizeof(SP_DEVINFO_DATA)};
//得到class GUID
SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0, NULL, &did);
//得到hardwareid的名字
SetupDiGetDeviceRegistryProperty(info,
&did,
SPDRP_HARDWAREID,
NULL,
(PBYTE)buffer,
bufferSize,
NULL);
SetupDiDestroyDeviceInfoList(info);
return TRUE;
}
int main()
{
char buffer[1024];
GetHardwareIDByInterfaceGUID((LPGUID)&GUID_CLASS_I82930_BULK,0,buffer,sizeof(buffer));
printf("HardwareID is %s/n",buffer);
return 0;
}
21.修改注册表后会产生什么消息
RegNotifyChangeKeyValue
22.获得当前移动磁盘的盘符
CString str = _T("z://");
for( char ch = 'z'; ch >= 'c'; ch--)
{
str.SetAt(0,ch);
UINT type = GetDriveType(str);
if(DRIVE_REMOVABLE == type)
{
AfxMessageBox(str);
}
}
23.edit控件追加字符的问题
CString strEdit;
m_edit1.GetWindowText(strEdit);
m_edit1.SetSel(strEdit.GetLength(), strEdit.GetLength());
strEdit += "1235";
m_edit1.ReplaceSel(strEdit);
24.ToolTip如何显示多行
m_ToolTips.SetMaxTipWidth(5000);
m_ToolTips.AddTool(GetDlgItem(IDC_BUTTON_DOWNLOAD),
25.显示桌面属性对话框
/*@Desktop @Theme @ScreenSaver @Appearance @Settings*/
ShellExecute(GetDesktopWindow()->m_hWnd,
"open","control.exe","desk.cpl Display,@Theme","",SW_SHOW );
26.Delphi可拖动的控件
在控件的MouseDown添加如下代码:
ReleaseCapture;
(Sender as TGroupBox).Perform(WM_SysCommand, $f012, 0);
27.VC中嵌入编译manifest文件
1.在.rc文件中用文本编辑器打开比如(notepad):然后手动添加如下内容:
#define RT_MANIFEST 24
//
//
// RT_MANIFEST
//
1 RT_MANIFEST "res/manifest.xml"
2.把manifest.xml文件放在res/目录下.最后重新编译后.就把清单文件信息编译进你的工程了.
Vista风格+请求管理员权限的xml文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="7.0.0.247"
processorArchitecture="X86"
name="XP Style"
type="win32"
/>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>