Newsgroup: it.comp.programmare.win32
Titolo: CreateProcess, FOCUS & window Properties. HELP. Nessuno sembra sapere...

Ho un problema, forse con la CreateProcess, forse no:
2 processi, A e B: A schedula B ad intervalli regolari.
Entrambi sono "Dialog based" ma B (quello lanciato), non ha una finestra
visibile all'utente.
Il problema è questo:
quando il processo A lancia il processo B, questo si prende momentaneamente
il focus per poi restituirlo immediatamente dopo. Questa situazione è assai
fastidiosa in quanto se l'utente sta digitando qualcosa al momento della
schedulazione, perde insorabilmente (seppure per qualche attimo) il focus.
Il processo A lancia B così:
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 ZeroMemory( &si, sizeof(si) );
 si.cb = sizeof(si);
 si.dwFlags = STARTF_USESHOWWINDOW;
 si.wShowWindow = SW_SHOWMINIMIZED | SW_SHOWNA | SW_HIDE;
 HWND Focus = GetFocus();
 UINT uiErrore = CreateProcess(
      NULL, // lpApplicationName // pointer to name of executable module
      CMD, // lpCommandLine  // pointer to command line string
      NULL, // lpProcessAttributes // process security attributes
      NULL, // lpThreadAttributes // thread security attributes
      NULL, // bInheritHandles  // handle inheritance flag
      FALSE,// dwCreationFlags  // creation flags
      0, // lpEnvironment  // pointer to new environment block
      NULL, // lpCurrentDirectory // pointer to current directory name
      &si, // lpStartupInfo  // pointer to STARTUPINFO
      &pi); // lpProcessInformation // pointer to PROCESS_INFORMATION
 SetFocus (Focus);
I parametri della STARTUPINFO sono stati settati più per prova che per
necessità (in effetti non mi producono alcuna significante differenza),
mentre con la SetFocus sono riuscito perlomeno a riavere "velocemente"
indietro il focus.
Il problema però potrebbe essere anche sul processo lanciato. Forse dovrebbe
essere lui a non prendersi il focus. Sì, ma come si fa? Ho provato gran
parte delle combinazioni possibili sulle proprietà della finestra (ora è
popup senza nessun altro attributo) e se uso la ShowWindow(SW_SHOWNA);
succede che addirittura mi flasha la finestra (WS_VISIBLE=FALSE!) in faccia.
Qualche idea, suggerimento?
Il problema è di molti ma, nonostante qualche ora spesa fra newsgruop e siti
vari, la soluzione sembra non essere di publico dominio!
In ogni caso, Grazie dell'attenzione!

 Qualche idea, suggerimento?
Non ho mai approfondito le mie conoscenze sull'interfaccia grafica di
Windows, comunque forse AttachThreadInput potrebbe esserti utile...non so...
Kiuhnm

 Windows, comunque forse AttachThreadInput potrebbe esserti utile...non
so...
Sembra che il mio vecchio post qualcuno l'abbia letto allora... : )

Grazie... Ho seguito il consiglio ma... niente!
Ecco il codice (perarltro trovato in un newsgroup), inserito nella
OnInitDialog del famigerato processo B (quello che viene lanciato)...
 HWND hWndCurrentFocus;
 HWND hWndForeground;
 DWORD idForeground;
 DWORD idCurrent;
 DWORD foregroundProcessId;
 idCurrent = GetCurrentThreadId();
 hWndForeground = ::GetForegroundWindow();
 idForeground =
GetWindowThreadProcessId(hWndForeground,&foregroundProcessId);
 if(idForeground != idCurrent)
  AttachThreadInput(idForeground, idCurrent, TRUE);
 hWndCurrentFocus = ::GetFocus();
 if(idForeground != idCurrent)
  AttachThreadInput(idForeground, idCurrent, FALSE);

 OnInitDialog del famigerato processo B (quello che viene lanciato)...
Ma perchč non chiami AttachThreadInput subito dopo CreateProcess???
CreateProcess(......... CREATE_SUSPENDED, ....., &pinfo);
AttachThreadInput(pinfo.dwThreadId, GetCurrentThreadId(), TRUE);
oppure
AttachThreadInput(GetCurrentThreadId(), pinfo.dwThreadId, TRUE);
(la doc. non č molto chiara...sembra che i due thread "condividano" l'input
quindi non dovrebbe fare alcuna differenza....o sě? Non ho voglia di fare
prove...)
ResumeThread(pinfo.hThread);
Kiuhnm

 Ma perchè non chiami AttachThreadInput subito dopo CreateProcess???
Perchè mi flasha prima... O meglio, mi flasha sulla CreateProcess
(breakpoint immediatamente dopo), segno che è il processo lanciato a rubarsi
il focus.


Come prima??? Prima di eseguirlo??????
Kiuhnm

 Ma perchè non chiami AttachThreadInput subito dopo CreateProcess???
Mi spiego meglio: "subito dopo aver chiamato la CreateProcess" il flash è
già avvenuto. Il processo lanciato, evidentemente, ha già rubato il focus
all'applicazione che lo aveva, per poi restituirglielo immediatamente dopo
(visto che non sa che farci non avendo niente di visibile da mostrare -tanto
è vero che quanto ho detto al primo post, riguardo alla getfocus/setfocus,
non è vero per niente!).
L'idea che mi son fatto è che non è la CreateProcess a creare il problema,
ma la "dialog based application". In effetti se allo stesso identico codice
faccio lanciare una "Consol application" tutto funziona bene (in quel caso
valgono i parametri della STARTUPINFO!).
Forse è messaggio WM_INITDIALOG a crearmi il problema?
Bho... devo dire che dopo tre giorni mi sono pure un po' stufato!
Cmq grazie mille per l'interessamento ;)

 flash è già avvenuto. Il processo lanciato, evidentemente, ha già
Hai usato il flag CREATE_SUSPENDED?
Kiuhnm