对话框图象生成程序FOR QQ
对话框图象生成程序FOR QQ
---
初学VC,请大家指教.
http://paper-plane.vicp.net/qqmsgbox.exe (连不上说明下班了。)
本人QQ:20449990
问题点数:20、回复次数:7Top
1 楼gwgok(gwg)回复于 2005-05-25 11:33:40 得分 0
http://gwgok.home4u.china.com/Top
2 楼qq153788616(啊灌)回复于 2005-05-26 17:59:01 得分 10
帮你顶~~~~~~~~~Top
3 楼gwgok(gwg)回复于 2005-05-27 10:48:02 得分 0
谢谢你。Top
4 楼gwgok(gwg)回复于 2005-05-27 10:52:18 得分 0
public:
struct struct_QQTM
{
short nProcessNum; //打开的QQ和TM的进程数量
short nChatWinNum; //所有当前打开的聊天窗口数量
short nMenuSelect; //当前所选择的聊天窗口
DWORD dwProcessID[10]; //QQ和TM的进程ID
HWND hChatWnd[20]; //聊天窗口句柄
HWND hRichEdit[20]; //聊天窗口中输入框句柄
CString csTitle[20]; //聊天窗口标题
short nFlag[20]; //标识聊天窗口所属QQ或TM
} s_QQ;Top
5 楼wang_yuanwai(王员外)回复于 2005-05-27 11:11:24 得分 10
ding!Top
6 楼gwgok(gwg)回复于 2005-05-27 11:18:05 得分 0
void CQqmsgboxDlg::OnOK()
{
UpdateData();
if(s_QQ.nChatWinNum==0 || !IsWindow(s_QQ.hChatWnd[s_QQ.nMenuSelect]))
switch(GetQQTMChatWindow())
{
case -1:
ShowErrorMsg("Can't find QQ has ran.");
return;
case 0:
ShowErrorMsg("Can't find QQ Chat Window.");
return;
default:
s_QQ.nMenuSelect = 0;
break;
}
//对话框格式
GetMsgType();
//对话框标题最好不为空
if (m_caption=="") m_caption=" ";
//启用线程弹出对话框,当前进程可以继续执行
CWinThread* pThread = AfxBeginThread(DlgThread,this);
//调用Sleep函数以使DlgThread进程先执行
Sleep(100);
CWnd* pDlgWnd = FindWindow(NULL,m_caption);
if (!pDlgWnd) {
ShowErrorMsg("Get Dialog Handle failed.");
return;
}
//获取对话框DC以生成图象
CDC memdc,*dc=pDlgWnd->GetWindowDC();
CBitmap Bmp;
RECT r;
pDlgWnd->GetWindowRect(&r);
int Width=r.right - r.left;
int Height=r.bottom - r.top;
Bmp.CreateCompatibleBitmap(dc,Width,Height);
memdc.CreateCompatibleDC(dc);
CBitmap*pOld=memdc.SelectObject(&Bmp);
memdc.BitBlt(0,0,Width,Height,dc,0,0,SRCCOPY);
memdc.SelectObject(pOld);
ReleaseDC(dc);
//关闭对话框
//::SendMessage(pWnd->GetSafeHwnd(),WM_CLOSE,0,0);
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
Sleep(50);
//建立CWnd类变量指向聊天窗口
CWnd *pChatWnd = (CWnd*)CWnd::FromHandle(s_QQ.hChatWnd[s_QQ.nMenuSelect]);
//建立CRichEditCtrl类变量指向RICHEDIT
CRichEditCtrl* pRichEdit = (CRichEditCtrl*)CWnd::FromHandle(s_QQ.hRichEdit[s_QQ.nMenuSelect]);
//将QQ聊天窗体恢复NORMAL状态,并设置为当前窗体
//需要增加对发按键是否可用的判断
pChatWnd->ShowWindow(SW_SHOWNORMAL);
pChatWnd->SetForegroundWindow();
Sleep(100);
//将鼠标位置定位到输入框上面,然后模拟鼠标左键按下,
//使QQ输入框获得焦点 (pRichEdit->SetFocus()无效)
pRichEdit->GetWindowRect(&r);
SetCursorPos(r.right-10,r.bottom-10);
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,GetMessageExtraInfo());
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,GetMessageExtraInfo());
//将生成的图象放入Clipboard
OpenClipboard();
// EmptyClipboard();
SetClipboardData(CF_BITMAP,(HANDLE)Bmp);
CloseClipboard();
//模拟按下CTRL+V键,将Clipboard中数据Paste到QQ输入框中
keybd_event(VK_CONTROL,0,0,0);
keybd_event('V',0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event('V',0,KEYEVENTF_KEYUP,0);
//如果选中Sended Immediately,将模拟按下CTRL+ENTER键直接发送图像
if (m_send == TRUE)
{
keybd_event(VK_CONTROL,0,0,0);
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
}
m_content = _T("");
UpdateData(FALSE);
//以下代码实现将图象插入RichEdit控件中(网友提供)
//但在QQ2003及其以后版本已屏蔽了外界消息
/*LPRICHEDITOLE pRichEditOle;
pRichEditOle = pRichEdit->GetIRichEditOle();
COleDataSource src;
STGMEDIUM sm;
sm.tymed=TYMED_GDI;
sm.hBitmap=(HBITMAP)Bmp.GetSafeHandle();
sm.pUnkForRelease=NULL;
src.CacheData(CF_BITMAP, &sm);
LPDATAOBJECT lpDataObject = (LPDATAOBJECT)src.GetInterface(&IID_IDataObject);
pRichEditOle->ImportDataObject(lpDataObject, 0, NULL);
lpDataObject->Release(); */
}
Top
7 楼gwgok(gwg)回复于 2005-05-27 11:20:49 得分 0
int CQqmsgboxDlg::GetQQTMChatWindow()
{
//获取打开的QQ及TM的进程ID
TCHAR pModName[_MAX_PATH];
CProcessIterator itp;
s_QQ.nProcessNum = 0;
for (DWORD pid=itp.First(); pid; pid=itp.Next())
{
CProcessModuleIterator itm(pid);
HMODULE hModule = itm.First();
if (hModule) GetModuleBaseName(itm.GetProcessHandle(),hModule, pModName,_MAX_PATH);
if (!stricmp(pModName,"QQ.exe") || !stricmp(pModName,"TM.exe"))
{
s_QQ.dwProcessID[s_QQ.nProcessNum++] = pid;
//break;
}
}
//未找到QQ进程号
if (0 == s_QQ.nProcessNum) return -1;
s_QQ.nChatWinNum = 0;
::EnumWindows(EnumWindowsProc,(LPARAM)this);
return s_QQ.nChatWinNum;
}
void CQqmsgboxDlg::OnDownarrow()
{
//此函数用于选择聊天窗口
HWND hPriorWnd = s_QQ.hChatWnd[s_QQ.nMenuSelect];
if (GetQQTMChatWindow() > 0)
{
int i,j,n=0;
//生成弹出菜单
//使弹出菜单自动选中上次所选择的菜单项,如果未选择,默认为第一项
if (s_QQ.nChatWinNum >= s_QQ.nMenuSelect) {
for(i=0;i<s_QQ.nChatWinNum;i++) {
if (s_QQ.hChatWnd[i] == hPriorWnd) {
n = i;
break;
}
}
}
CMenu PopMenu;
PopMenu.CreatePopupMenu();
for(j=0;j<s_QQ.nProcessNum;j++)
{
for(i=0;i<s_QQ.nChatWinNum;i++)
{
if(s_QQ.nFlag[i] == j)
PopMenu.AppendMenu(i==n ? MF_STRING|MF_CHECKED : MF_STRING|MF_UNCHECKED,
WM_USERMESSAGE + i,s_QQ.csTitle[i]);
}
PopMenu.AppendMenu(MF_SEPARATOR);
}
PopMenu.DeleteMenu(PopMenu.GetMenuItemCount() - 1,MF_BYPOSITION);
s_QQ.nMenuSelect = n;
POINT mouse;
GetCursorPos(&mouse);
PopMenu.TrackPopupMenu(0,mouse.x,mouse.y,this,NULL);
PopMenu.DestroyMenu();
}
}
Top




