Ронин
Мнения: (55)
|
Това е един клас от една програмка която писах за автоматичен отговор на получено съобщение. Незнам дали ще ти свърши някаква работа, но все пак дава някакъв скелет на това което искаш да правиш.
Може да си изтеглиш *.idl файла (аз го имам ако не го намериш) и от там ще си правиш експерименти по описанието на методите и пропъртитата.
Общо казано моята програма реагира на (някои) събития когато ръчкаш по Скайпа.
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
| #ifndef __CSkypeManager_H
#define __CSkypeManager_H
#pragma once
class CSkypeManager : public _ISkypeEvents
{
public:
CSkypeManager(const GUID& iidInterface, const IID& iidLib, int verMajor, int verMinor);
~CSkypeManager();
public:
void Init();
bool Attach();
bool Detach();
void SetTextSource(HWND hWnd);
STDMETHOD_(ULONG, AddRef)()
{
return 1;
}
STDMETHOD_(ULONG, Release)()
{
return 1;
}
STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject)
{
HRESULT hr = S_OK;
if(iid == IID_IUnknown)
{
*ppvObject = (IUnknown*)this;
}
else if(iid == __uuidof(IDispatch))
{
*ppvObject = (IDispatch*)this;
}
else if(iid == __uuidof(_ISkypeEvents))
{
*ppvObject = (_ISkypeEvents*)this;
}
else
{
hr = E_NOINTERFACE;
*ppvObject = NULL;
}
return hr;
}
STDMETHOD(GetTypeInfoCount)(UINT* pctinfo);
STDMETHOD(GetTypeInfo)(UINT itinfo, LCID lcid, ITypeInfo** pptinfo);
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, UINT cNames, LCID lcid, DISPID* rgdispid);
STDMETHOD(Invoke)(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr);
public:
STDMETHOD(MessageStatus)(IChatMessage* pMessage, TChatMessageStatus Status);
STDMETHOD(UserStatus)(TUserStatus Status);
STDMETHOD(OnlineStatus)(IUser* pUser, TOnlineStatus eStatus);
protected:
void Advise(BOOL bAdvise, IUnknown* pUnkSource, const IID& riid, DWORD& dwCookie);
void AdviseSkype(BOOL bAdvise);
private:
DWORD m_dwSkypeEventsCookie;
CComPtr<ISkype> m_spSkype;
CComPtr<IConversion> m_spConversion;
CComPtr<IClient> m_spClient;
private:
HWND m_hWndSource;
};
#endif |
Сега CPP файла.
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
| #include "StdAfx.h"
#include "SkypeManager.h"
CSkypeManager::CSkypeManager(const GUID& iidInterface, const IID& iidLib, int verMajor, int verMinor)
{
m_dwSkypeEventsCookie = 0;
m_hWndSource = NULL;
}
CSkypeManager::~CSkypeManager()
{
}
STDMETHODIMP CSkypeManager::MessageStatus(IChatMessage* pMessage, TChatMessageStatus Status)
{
HRESULT hr = 0;
if(Status == cmsReceived)
{
TChatMessageType eMsgType;
pMessage->get_Type(&eMsgType);
if(eMsgType == cmeSaid)
{
CComPtr<IChat> spChat;
if(S_OK == pMessage->get_Chat(&spChat) && spChat && m_hWndSource)
{
CComPtr<IChatMessage> spChatMessage;
::SendMessage(::GetParent(m_hWndSource), WM_MSG_RECEIVED, 0, 0);
TCHAR tchText[256];
::GetWindowText(m_hWndSource, tchText, 256);
hr = spChat->SkypeSendMessage(CComBSTR(tchText), &spChatMessage);
}
}
}
return hr;
}
STDMETHODIMP CSkypeManager::UserStatus(TUserStatus )
{
return (m_spSkype && S_OK == m_spSkype->ChangeUserStatus(cusOnline));
}
STDMETHODIMP CSkypeManager::OnlineStatus(IUser* pUser, TOnlineStatus eStatus)
{
return S_OK;
}
STDMETHODIMP CSkypeManager::GetTypeInfoCount(UINT* pctinfo)
{
return E_NOTIMPL;
}
STDMETHODIMP CSkypeManager::GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
{
return E_NOTIMPL;
}
STDMETHODIMP CSkypeManager::GetIDsOfNames(REFIID riid, LPOLESTR* rgszNames, UINT cNames,
LCID lcid, DISPID* rgdispid)
{
return E_NOTIMPL;
}
STDMETHODIMP CSkypeManager::Invoke(DISPID dispidMember, REFIID riid,
LCID lcid, WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
EXCEPINFO* pexcepinfo, UINT* puArgErr)
{
HRESULT hRes = 0;
if(dispidMember == 0x07) {
CComPtr<IUser> spUser;
hRes = pdispparams->rgvarg[1].pdispVal->QueryInterface(__uuidof(IUser), (void**)&spUser);
if(hRes != S_OK)
return hRes;
TOnlineStatus eStatus = (TOnlineStatus)pdispparams->rgvarg[0].intVal;
OnlineStatus(spUser, eStatus);
}
else if(dispidMember == 0x06) {
TUserStatus eStatus = (TUserStatus)pdispparams->rgvarg[0].intVal;
UserStatus(eStatus);
}
else if(dispidMember == 0x0b) {
CComPtr<IChatMessage> spChatMessage;
hRes = pdispparams->rgvarg[1].pdispVal->QueryInterface(__uuidof(IChatMessage), (void**)&spChatMessage);
if(hRes != S_OK)
return hRes;
TChatMessageStatus eStatus = (TChatMessageStatus)pdispparams->rgvarg[0].intVal;
MessageStatus(spChatMessage, eStatus);
}
return S_OK;
}
void CSkypeManager::Advise(BOOL bAdvise, IUnknown* pUnkSource, const IID& riid, DWORD& dwCookie)
{
if (!bAdvise && dwCookie == 0)
return;
if (bAdvise && dwCookie != 0)
Advise(FALSE, pUnkSource, riid, dwCookie);
CComPtr<IConnectionPointContainer> spContainer;
if (pUnkSource
&& SUCCEEDED(pUnkSource->QueryInterface(IID_IConnectionPointContainer, (void**)&spContainer)))
{
CComPtr<IConnectionPoint> spCP;
if ( SUCCEEDED(spContainer->FindConnectionPoint(riid, &spCP)) )
{
CComPtr<IUnknown> spUnkThis;
this->QueryInterface(IID_IUnknown, (void**)&spUnkThis);
if (bAdvise)
spCP->Advise(spUnkThis, &dwCookie);
else
spCP->Unadvise(dwCookie);
}
}
if (!bAdvise)
dwCookie = 0;
}
void CSkypeManager::AdviseSkype(BOOL bAdvise)
{
CComPtr<IUnknown> spUnkSkype;
if (!m_spSkype || FAILED(m_spSkype->QueryInterface(IID_IUnknown, (void**)&spUnkSkype)))
return;
Advise(bAdvise, spUnkSkype, __uuidof(_ISkypeEvents), m_dwSkypeEventsCookie);
}
void CSkypeManager::Init()
{
if(S_OK != ::CoCreateInstance(__uuidof(Skype), NULL, CLSCTX_ALL, __uuidof(ISkype), (void**)&m_spSkype))
return;
if(S_OK != m_spSkype->get_Convert(&m_spConversion))
return;
if(S_OK != m_spSkype->get_Client(&m_spClient))
return;
AdviseSkype(TRUE);
}
bool CSkypeManager::Attach()
{
if(m_spSkype == NULL || m_spConversion == NULL || m_spClient == NULL)
return false;
VARIANT_BOOL vbRes = VARIANT_FALSE;
if(S_OK != m_spClient->get_IsRunning(&vbRes))
return false;
if(vbRes == VARIANT_FALSE)
{
if(S_OK != m_spClient->Start(VARIANT_FALSE, VARIANT_FALSE))
return false;
}
if(S_OK != m_spSkype->ChangeUserStatus(cusOnline))
return false;
TAttachmentStatus eAttachmentStatus;
if(S_OK != m_spSkype->get_AttachmentStatus(&eAttachmentStatus))
return false;
if(eAttachmentStatus == apiAttachSuccess)
{
long lProtocol = 0;
if(S_OK != m_spSkype->get_Protocol(&lProtocol))
return false;
if(S_OK != m_spSkype->Attach(lProtocol, VARIANT_TRUE))
return false;
}
return true;
}
bool CSkypeManager::Detach()
{
AdviseSkype(FALSE);
return true;
}
void CSkypeManager::SetTextSource(HWND hWnd)
{
m_hWndSource = hWnd;
} |
А, това трябва да го включиш някъде (в моя случай е в stdafx.h)
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #include <tchar.h>
#include <windows.h>
#include <atlbase.h>
#include <atlcom.h>
#include <comutil.h>
#include <atlcoll.h>
#include <atlstr.h>
#include <atlwin.h>
#include <Commctrl.h>
#include "resource.h"
using namespace ATL;
#define WM_MSG_RECEIVED WM_USER + 200
#import "Skype4COM.dll" no_namespace raw_interfaces_only named_guids rename("CreateEvent", "SkypeCreateEvent") rename("SendMessage", "SkypeSendMessage") |
WM_MSG_RECEIVED се прихваща от главния прозерец (или който искаш).
А, ето как се използва:
CODE1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| ...
case WM_INITDIALOG:
{
g_pSkypeManager = new CSkypeManager(__uuidof(_ISkypeEvents), LIBID_SKYPE4COMLib, 1, 0);
g_pSkypeManager->Init();
if(g_pSkypeManager->Attach() == true)
{
SendMessage(hwndStatusBar, SB_SETTEXT, 0, (LPARAM)_T("Successfully attached to Skype"));
}
else
{
SendMessage(hwndStatusBar, SB_SETTEXT, 0, (LPARAM)_T("Cannot attach to Skype"));
}
g_hWnd = hwnd;
TCHAR tchText[] = _T("Don't disturb !");
::SetWindowText(::GetDlgItem(hwnd, IDC_EDIT1), tchText);
g_pSkypeManager->SetTextSource(::GetDlgItem(hwnd, IDC_EDIT1));
}
return 0;
... |
|