Показать сообщение отдельно
Старый 25.03.2008, 12:33
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 8  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
>>мне казалось, что в цинке достаточно вот эту строчку прописать

Код:
myDLL = new mdm.DLL("имя_моей_библиотеки.dll")в самом начале кода и при выходе выполнить

Код:
myDLL.close();>>
так и надо поступать. myDll.call() вызываем по небходимости вызова длл-ной функции, не забывая про список параметров.
у меня версия 2.5.0.34, чего и вам желаю
Код:
hDll = new mdm.DLL(dllPath);
if (!hDll.isLoaded) {
	mdm.prompt("Dll load failed!");
	return;
}
только true isLoaded будет при реалной загрузке. если длл уже в оперативке (как например системная какая-нибудь) будет false. но работать все равно должно.
если есть сомнения в работоспособности кода в длл - дебажить надо и все. как - это вопрос отдельный. элементарно: встроить в код длл какой-нибудь мессаджбокс, чтоб выскакивал в нужном месте. ну или debag tools разного рода юзать.
Код:
//  в длл встраиваем такие функции. ReplaceWndProc вызываем из цинка или
 //сразу при загрузке длл из EntryPoint. 
//предварительно надо найти окно плеера в цинке 

LRESULT CALLBACK GetMsgProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam){

		switch (nMsg) {
			case WM_MOUSEMOVE:
			// ...
			break;
			case WM_MBUTTONUP:
			// ...	
			break;
			case WM_RBUTTONUP:
			// ...
			break;
			case WM_LBUTTONDBLCLK:
			// ...
			break;
			case  WM_SYSKEYDOWN:
			// ...	
			break;
			case WM_KEYDOWN:
					switch (wParam)
					{
						case VK_LEFT:
							break;
						case VK_RIGHT:
							break;
						case VK_UP:
							break;
						case VK_DOWN:
							break;
						case VK_HOME:
							break;
						case VK_END:
							break;
						case VK_INSERT:
							break;
						case VK_DELETE:
							break;
						case VK_F2:
							break;
						case VK_LWIN:
							//MessageBox(hwin,(LPCSTR)"left winbuttonb down","",MB_OK);
							break;
						case 93:// это и есть кнопка "меню"
							//MessageBox(hwin,(LPCSTR)"menubutton down","",MB_OK);
							return 1; // прекращаем обработку сообщения, меню не вываливается
							break;
						default:
							//
							break;
					}
			default:
				//
			break;
		}
// передаем все далее родной процедуре на обработку
		return CallWindowProc((WNDPROC)oldWnd, hwin, nMsg, wParam, lParam);
} 
// поиск окна плеера fName - заголовок (title) формы приложения
// имя класса окна плеера можно узреть в WinSpector'e, например.
HWND fwin = FindWindow(NULL,fName);
HWND tpan = FindWindowEx(fwin,NULL,(LPCSTR)"TPanel",NULL);
hwin = FindWindowEx(tpan,NULL,(LPCSTR)"FlashPlayerControl_MacromediaFlashPlayerActiveX_7309416",NULL);
// собственно подмена оконной процедуры
extern "C" __declspec(dllexport)LONG ReplaceWndProc(BOOL bSet){
	if(bSet){
		oldWnd = SetWindowLong(hwin, GWL_WNDPROC, (LONG)GetMsgProc);
		return oldWnd;
	} else{ 
		
		return SetWindowLong(hwin, GWL_WNDPROC, oldWnd);
	}
}
откопал кусок исходника рабочего. посмотрите. может пригодится.
Вариант с хуком принципиально не отличается. вместо подмены надо юзать
SetWindowsHookEx(WH_GETMESSAGE, hpHookProc, hHookDll, hthread);


Последний раз редактировалось alexcon314; 25.03.2008 в 12:54.