Есть вопрос к программистам, знающим WinAPI. | Код | //--------------------------------------------------------------------------- //исходник hook.dll, используемый для установки хука.
#include <windows.h> #include "hooks.hpp"
#define WM_HOOK_DONE WM_USER + 100 HHOOK g_hhook = NULL; WNDPROC OldWndProc = NULL; HWND NexthDialog, hParent; char a[256];
extern "C" { __declspec(dllexport) LRESULT __stdcall DialogProc(int code,WPARAM wParam, LPARAM lParam); }
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved) { return 1; } //---------------------------------------------------------------------------
LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { //функция - обработчик сообщений от диалога (подставляется вместо родного при помощи хука) //проверял - все сообщения действительно перехватываются, т.е. все реально работает. LRESULT RetVal = 0; switch(uMsg) { case WM_NOTIFY: { LPOFNOTIFY pofn = (LPOFNOTIFY)lParam; if(pofn->hdr.code == NM_RCLICK) //если пришел правый клик от одного из элементов диалога { char b[256]="qwert"; CommDlg_OpenSave_GetFilePath(hWnd, b, 256); //пытаемся получить выбранный путь MessageBox(hWnd,b ,"",0); //вот тут то и возникает вопрос: почему массив b содержит один левый, но стабильный(запускал много раз) символ, //хотя должен содержать путь и имя выбранного файла в диалоге. //если бы произошла ошибка, то содержимое массива не затерлось бы, а получается буква "H" //если кто знает как еще можно получить выделенный путь и имя файла, напишите пожалуйста. } RetVal = CallWindowProc((FARPROC)OldWndProc,hWnd,uMsg,wParam,lParam); break; } default: RetVal = CallWindowProc((FARPROC)OldWndProc,hWnd,uMsg,wParam,lParam); } return RetVal; }
__declspec(dllexport) LRESULT __stdcall DialogProc(int code,WPARAM wParam, LPARAM lParam) //функция - хук, работает исправно, всё что задумано - реализуется (проверял) { while(NexthDialog=FindWindowEx(NULL,NexthDialog,"#32770",NULL)) //поиск первого попавшегося диалога открыть/сохранить { hParent = GetParent(NexthDialog); if(GetClassName(hParent,a,256)) { if(!strcmp(a,"OpWindow")) //если класс окна родителя диалога нас удовлетворяет, то проверяем { //устанавливали ли мы раньше нашу функцию-обработчик if(!OldWndProc) { OldWndProc = (WNDPROC)GetWindowLong(NexthDialog,DWL_DLGPROC); int err = SetWindowLong(NexthDialog,DWL_DLGPROC,(LONG)WndProc); //подмена обработчика if(!err) MessageBox(NULL,"Error InstallWndProc","",0); } } } }
return CallNextHookEx(g_hhook, code, wParam, lParam); }
|
|