MVV
|
Posted: Thu Jul 05, 2012 11:25 Post subject: |
|
|
А тебе просто необходимо окно, чтобы получить ответ, иначе никак. Подцепляться к оконной процедуре тотала в данной ситуации - абсолютно некорректно.
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… |
|