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
MVV



PostPosted: Thu Jul 05, 2012 11:25    Post subject: Reply with quote

А тебе просто необходимо окно, чтобы получить ответ, иначе никак. Подцепляться к оконной процедуре тотала в данной ситуации - абсолютно некорректно.

Code:
//25.11.11 Added:
// Send WM_COPYDATA with dwData='G'+256*'W': Same as with 'G'+256*'A', but data is returned as UTF-16 Unicode. dwData of return is 'R'+256*'W' (32/64)

//25.11.11 Added:
// Send WM_COPYDATA with dwData='G'+256*'A' and lpData pointing to command to get back WM_COPYDATA with various info.
// Supported commands
// A: Active side (returns L or R), or two byte command: first byte: L=left, R=right, S=source, T=target.
// Second byte: P=current path, C=list count, I=caret index, N=name of file under caret. dwData of return is 'R'+256*'A' (32/64)

struct SendCopyData_t {
   const COPYDATASTRUCT* cds_in;
   COPYDATASTRUCT* cds_out;
};

LRESULT __stdcall SendCopyDataProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   if (uMsg==WM_CREATE) {
      CREATESTRUCT& cs=*(CREATESTRUCT*)lParam;
      SendCopyData_t& scd=*(SendCopyData_t*)cs.lpCreateParams;
      HWND htcwnd=FindWindow(L"TTOTAL_CMD", 0);
      SetWindowLongPtr(hWnd, GWLP_USERDATA, (LPARAM)&scd);
      scd.cds_out->dwData=0;
      int r=SendMessage(htcwnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)scd.cds_in);
      PostQuitMessage(r ? 0 : 1);
   }
   else if (uMsg==WM_COPYDATA) {
      SendCopyData_t& scd=*(SendCopyData_t*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
      COPYDATASTRUCT& cds=*(COPYDATASTRUCT*)lParam;
      scd.cds_out->dwData=cds.dwData;
      scd.cds_out->cbData=cds.cbData;
      memcpy(scd.cds_out->lpData, cds.lpData, cds.cbData);
      return 1;
   }

   return DefWindowProc(hWnd, uMsg, wParam, lParam);
}


bool SendCopyData(const COPYDATASTRUCT* cds_in, COPYDATASTRUCT* cds_out) {
   SendCopyData_t scd={cds_in, cds_out};

   const WNDCLASS wc={0, SendCopyDataProc, 0, 0, GetModuleHandle(0), 0, 0, 0, 0, L"SendCopyDataWnd"};
   HWND hWnd=CreateWindow((LPWSTR)RegisterClass(&wc), wc.lpszClassName, 0, 0, 0, 0, 0, 0, 0, wc.hInstance, &scd);

   if (!hWnd) return 0;

   while (1) {
      MSG msg;
      if (!~GetMessage(&msg, hWnd, 0, 0)) return 0;
      if (msg.message==WM_QUIT) return msg.wParam!=0;

      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }
}


Так можно создать временное окно и послать нужное сообщение. Структура cds_in заполняется как обычно, а структура cds_out должна содержать адрес и размер буфера, куда будет возвращена строка от тотала, и размер данных при возвращении будет установлен в тот, что вернёт тотал.
_________________
TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое (обсуждение)
WINCMD.RU: AskParam, CopyTree, NTLinks, Sudo, VirtualPanel…
View user's profile Send private message ICQ Number


Powered by phpBB © 2001, 2005 phpBB Group