1.使用ModifyStyleEx改变了控件风格无效
答:修改之后,重绘一次,如果还不行的话,再试试看调用SetWindowPos(0,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME);
2.动态设置编辑框的ES_PASSWORD无效
答:修改之后,需要调用一次SetPasswordChar('*');
3.如何获取任务栏小图标?
答:有网友提出,能不能在程序界面上显示当前的托盘图标,这样更直观一些。这一点我也曾想到过,也知道奥秘就在TBBUTTON这个结构体的dwData域里面,可惜这个域的结构在MSDN中没有描述。我也曾试着发送TB_GETIMAGELIST消息获取image list的句柄,然后用CImageList::FromHandle加载到CImageList中,但却都失败了。
在csdn网友的帮助下,我弄清了dwData的结构,其实dwData有一个这样的机构,我们命名为TRAYDATA:
struct TRAYDATA
{
HWND hwnd;
UINT uID;
UINT uCallbackMessage;
DWORD Reserved[2];
HICON hIcon; //托盘图标的句柄
};
要获取到这个hIcon,其实很简单:
//分配虚拟内存
lngAddress = VirtualAllocEx(hProcess, NULL, sizeof(TBBUTTON), MEM_COMMIT, PAGE_READWRITE);
//将hProcess进程内,地址为lngAddress中的内容(大小为sizeof(TBBUTTON))获取到tb中
ret = ::ReadProcessMemory(hProcess, LPVOID(long(lngAddress)), &tb, sizeof(TBBUTTON), 0);
//将hProcess进程内,地址为tb.dwData中的内容(大小为sizeof(TRAYDATA))获取到tray中
ret = ::ReadProcessMemory(hProcess, LPVOID(tb.dwData), &tray, sizeof(TRAYDATA), 0);
然后就可以用tray.hIcon索引到这个图标句柄了
//释放内存代码略
4.BeginWaitCursor和EndWaitCursor无效
答:SetCapture();BeginWaitCursor();....EndWaitCursor();ReleaseCapture();
5.打印源码中文件名和行号常用的宏名是什么?
答:文件名:__FILE__ 行号:__LINE__
6.如何具体判断一个字符串中哪个是英文字母
答:函数isalpha
7.在注册表中如何得到所有安装了的应用程序程序的信息
答:HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall下面的子鍵
8.64位系统下运行32的程序,操作注册表遭遇重定向问题
答: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);
9.怎么使用系统默认浏览器在新窗口打开网页
答: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);
10.怎么清除串口的输入缓冲
答:PurgeComm(hCom,PURGE_TXABORT ¦ PURGE_RXABORT ¦ PURGE_TXCLEAR ¦ PURGE_RXCLEAR);
11.显示桌面属性对话框
答:ShellExecute(GetDesktopWindow()->m_hWnd,"open","control.exe","desk.cpl Display,@Theme","",SW_SHOW );
12.限制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);
}
VC++ 笔记
最新推荐文章于 2021-04-15 17:06:45 发布