VC\MFC 编程经验总结—1(转)
2013-03-27 13:58
435 查看
Q
获取Windows外壳主窗口的句柄
A
在编程过程中,我们常常需要获取Windows外壳主窗口的句柄(HWND),微软在MSDN中提供了一个这样的函数:
HWND hwndShell = FindWindow("Program",NULL);
用这个函数可以满足我们的要求,但本文再提供一个更好的方法,用User32.dll中的GetShellWindow,这个函数的原型很简单:HWND GetShellWindow; 只是这个函数是个未公开的API函数,所以要使用它必须动态加载User32.dll。方法如下:
typedef HWND (WINAPI *PROCGETSHELLWND)();
PROCGETSHELLWND GetShellWindow;
HMODULE hUser32 = GetModuleHandle("user32");
GetShellWindow = (PROCGETSHELLWND)
GetProcAddress(hUser32,"GetShellWindow");
Q
如何向剪贴板发送字符串
A
假设你已有了名为My的对话框的工程.有了一个按钮并有了其响应的函数:OnButton1()
void CMyDlg::OnButton1()
{
CString str = "Some text";
::OpenClipboard(this->m_hWnd);
::EmptyClipboard();
HGLOBAL h = GlobalAlloc(GHND | GMEM_SHARE, str.GetLength() + 1);
strcpy((LPSTR)GlobalLock(h), str);
GlobalUnlock(h);
::SetClipboardData(CF_TEXT, h);
::CloseClipboard();
}
Q
任务管理器如何确定应用程序"没有响应"
A
最近参加的一个项目要求实现远程任务管理功能,也就是"Remote Task Manager"(RTM)。我把它与Windows NT的任务管理器进行了比较,发现标准的任务管理器显示应用程序的状态(正在运行或者没有响应)。标准的任务管理器发送(通过SendMessageTimeout函数)一个消息到主应用窗口,如果函数调用失败或者超时--则应用程序的状态就是"没有响应",否则状态为"正在运行"。
但我发现还有一个更好的解决方法。本文将通过实例程序进行示范。这个方法的思路是通过调用User32.dll中一个未公开的函数来实现的。这个函数存在于Windows 9x和Windows NT/2000系统中,但在两个系统中的名字是不同的。Windows 9x系统中的名字为:IsHungThread,在Windows NT/2000系统中的名字为IsHungAppWindow。下面是它们的原型:
BOOL IsHungAppWindow (
HWND hWnd, // 主应用窗口句柄
);
和
BOOL IsHungThread (
DWORD dwThreadId, // 主应用窗口的线程ID
);
不幸的是,微软在User32.lib中没有提供这两个函数的输出。也就是说,这两个函数是未公开函数,如果要在程序中使用它们,则必须通过GetProcAddress和GetModuleHandle函数动态加载:
typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW) (HWND);
typedef BOOL (WINAPI *PROCISHUNGTHREAD) (DWORD);
PROCISHUNGAPPWINDOW IsHungAppWindow;
PROCISHUNGTHREAD IsHungThread;
HMODULE hUser32 = GetModuleHandle("user32");
IsHungAppWindow = (PROCISHUNGAPPWINDOW)
GetProcAddress(hUser32,"IsHungAppWindow");
IsHungThread = (PROCISHUNGTHREAD)
GetProcAddress(hUser32,"IsHungThread");
Q
Installshield快捷方式设置
获取Windows外壳主窗口的句柄
A
在编程过程中,我们常常需要获取Windows外壳主窗口的句柄(HWND),微软在MSDN中提供了一个这样的函数:
HWND hwndShell = FindWindow("Program",NULL);
用这个函数可以满足我们的要求,但本文再提供一个更好的方法,用User32.dll中的GetShellWindow,这个函数的原型很简单:HWND GetShellWindow; 只是这个函数是个未公开的API函数,所以要使用它必须动态加载User32.dll。方法如下:
typedef HWND (WINAPI *PROCGETSHELLWND)();
PROCGETSHELLWND GetShellWindow;
HMODULE hUser32 = GetModuleHandle("user32");
GetShellWindow = (PROCGETSHELLWND)
GetProcAddress(hUser32,"GetShellWindow");
Q
如何向剪贴板发送字符串
A
假设你已有了名为My的对话框的工程.有了一个按钮并有了其响应的函数:OnButton1()
void CMyDlg::OnButton1()
{
CString str = "Some text";
::OpenClipboard(this->m_hWnd);
::EmptyClipboard();
HGLOBAL h = GlobalAlloc(GHND | GMEM_SHARE, str.GetLength() + 1);
strcpy((LPSTR)GlobalLock(h), str);
GlobalUnlock(h);
::SetClipboardData(CF_TEXT, h);
::CloseClipboard();
}
Q
任务管理器如何确定应用程序"没有响应"
A
最近参加的一个项目要求实现远程任务管理功能,也就是"Remote Task Manager"(RTM)。我把它与Windows NT的任务管理器进行了比较,发现标准的任务管理器显示应用程序的状态(正在运行或者没有响应)。标准的任务管理器发送(通过SendMessageTimeout函数)一个消息到主应用窗口,如果函数调用失败或者超时--则应用程序的状态就是"没有响应",否则状态为"正在运行"。
但我发现还有一个更好的解决方法。本文将通过实例程序进行示范。这个方法的思路是通过调用User32.dll中一个未公开的函数来实现的。这个函数存在于Windows 9x和Windows NT/2000系统中,但在两个系统中的名字是不同的。Windows 9x系统中的名字为:IsHungThread,在Windows NT/2000系统中的名字为IsHungAppWindow。下面是它们的原型:
BOOL IsHungAppWindow (
HWND hWnd, // 主应用窗口句柄
);
和
BOOL IsHungThread (
DWORD dwThreadId, // 主应用窗口的线程ID
);
不幸的是,微软在User32.lib中没有提供这两个函数的输出。也就是说,这两个函数是未公开函数,如果要在程序中使用它们,则必须通过GetProcAddress和GetModuleHandle函数动态加载:
typedef BOOL (WINAPI *PROCISHUNGAPPWINDOW) (HWND);
typedef BOOL (WINAPI *PROCISHUNGTHREAD) (DWORD);
PROCISHUNGAPPWINDOW IsHungAppWindow;
PROCISHUNGTHREAD IsHungThread;
HMODULE hUser32 = GetModuleHandle("user32");
IsHungAppWindow = (PROCISHUNGAPPWINDOW)
GetProcAddress(hUser32,"IsHungAppWindow");
IsHungThread = (PROCISHUNGTHREAD)
GetProcAddress(hUser32,"IsHungThread");
Q
Installshield快捷方式设置
相关文章推荐
- VC/MFC 编程经验总结
- VC\MFC 编程经验总结—3(转)
- VC\MFC 编程经验总结—2(转)
- [经验总结]自己动手编译MFC/ATL库
- 编程的学习方法,轻松化,以及短期的学习编程经验总结
- 写给已有编程经验的 Python 初学者的总结
- MFC 对话框编程 总结
- 手机编程经验总结
- 多年编程生涯总结的7条经验
- shell编程经验总结
- 【转载】15年编程生涯,资深架构师总结的7条经验
- VC/MFC之ListCtrl控件使用经验总结(转)
- 不能不记住的编程经验总结
- MFC中的经验小技巧总结(不断更新中~~~~)
- VS.NET编程经验阶段总结
- 12年编程生涯,总监级架构师总结的7条经验
- 程序员编程知识经验总结
- 我从编程总结的 22 个经验
- 写给已有编程经验的 Python 初学者的总结
- php 编程经验教训,纯属个人总结