Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Не получается встроить окно внешней проги 
Author Message
AkulaBig



PostPosted: Mon Jul 19, 2021 13:59    Post subject: Reply with quote

Решил привести полностью процедуру, может это поможет:
Code:
extern "C" __declspec(dllexport) HWND __stdcall ListLoadW(HWND ParentWin,wchar_t* FileToLoad,int ShowFlags) {
   bool sf = false;
   if (WS_CHILD & GetWindowLong((HWND)ParentWin, GWL_STYLE))sf = true;
   HWND ppp = GetFocus();
   PROCESS_INFORMATION pi = { 0 };
   STARTUPINFOW si = { 0 };
   wchar_t path[MAX_PATH] = L"";
   wchar_t rpath[MAX_PATH] = L"";
   wchar_t spath[MAX_PATH] = L"";
   GetModuleFileNameW(hInst, path, MAX_PATH);
   //PathRemoveFileSpecW((LPWSTR)path);
   if (wcsrchr(path, L'\\'))*wcsrchr(path, L'\\') = L'\0';
   wcscat_s(path, MAX_PATH, L"\\");
   wcscpy_s(spath, MAX_PATH, path);
   wcscpy_s(rpath, MAX_PATH, path);
   wcscat_s(spath, MAX_PATH, PROGRAMNAME);
   wcscat_s(rpath, MAX_PATH, PROGRAMNAME);
   wchar_t cmd[4096]=L"";
   WNDCLASSA wc = {};
   wc.hCursor=LoadCursor(NULL,IDC_ARROW);
   wc.style=CS_DBLCLKS;
   wc.hInstance     = hInst;
   wc.lpfnWndProc   = WLXPluginsWindowProc;
   wc.lpszClassName = "WLXPluginsClass";
   RegisterClassA(&wc);
   RECT r;
   GetClientRect(ParentWin,&r);
   HWND WLXPluginsClass = CreateWindowExA(0, "WLXPluginsClass", NULL, WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN, r.left, r.top, r.right-r.left,r.bottom-r.top, ParentWin, NULL, hInst, NULL);
   swprintf_s(cmd,4096,L"%s -plugin %d \"%s\"",rpath,WLXPluginsClass,FileToLoad);
   si.cb = sizeof(si);
   if (CreateProcessW(NULL, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
   {
      HWND swnd = NULL;
      for (int i = 0; swnd == NULL && i < 5000; i++) {
         Sleep(10);
         swnd = FindWindowEx(WLXPluginsClass, NULL, NULL, NULL);
      }
      if (sf)SetWindowLongPtr(WLXPluginsClass, GWLP_USERDATA, (LONG)SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)SpyProcQ, hInst, pi.dwThreadId));
      else
         SetWindowLongPtr(WLXPluginsClass, GWLP_USERDATA, (LONG)SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)SpyProcN, hInst, pi.dwThreadId));
      if (sf) {
         for (int i = 0; GetFocus() == ppp && i < 5000; i++)Sleep(10);
         SetFocus(ppp);
      }
      CloseHandle(pi.hProcess);
      CloseHandle(pi.hThread);
      return WLXPluginsClass;
   }
   else   DestroyWindow(WLXPluginsClass);
   return NULL;

}

Вот эту строку я не могу понять. Если убрать -plugin, то и суматра выводится отдельным окном.
swprintf_s(cmd,4096,L"%s -plugin %d \"%s\"",rpath,WLXPluginsClass,FileToLoad);
То-есть проблема явно в этой строке, но как она должна правильно выглядеть - не пойму.
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group