C++/MFC Detectarea unei ferestre noi
C++/MFC Detectarea unei ferestre noi
Buna ziua,
Cum as putea in C++/MFC sa detectez cand a aparut o fereastra oarecare?
Stiu metoda prin FindWindow(...,...), dar problema este ca numai atunci functioneaza doar cand il pun intr-un WHILE, stiti voi alta metoda? ex mesaje din AFX/MFC cand se creaza un oarecare dialog?
PS: Sunt la inceput de drum, stiu programare C++/MFC Clase, Vreau sa dezvolt o aplicatie prin care imi afiseaza toate ferestrele deschise, si am nevoie si la crearea ferestrelor noi, sa apara in program...
Multumesc
Cum as putea in C++/MFC sa detectez cand a aparut o fereastra oarecare?
Stiu metoda prin FindWindow(...,...), dar problema este ca numai atunci functioneaza doar cand il pun intr-un WHILE, stiti voi alta metoda? ex mesaje din AFX/MFC cand se creaza un oarecare dialog?
PS: Sunt la inceput de drum, stiu programare C++/MFC Clase, Vreau sa dezvolt o aplicatie prin care imi afiseaza toate ferestrele deschise, si am nevoie si la crearea ferestrelor noi, sa apara in program...
Multumesc
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: C++/MFC Detectarea unei ferestre noi
Nu trebuie sa recurgi la while ci poti seta un timer in care sa-ti refresezi lista de ferestre cu EnumWindows si/sau EnumChildWindows.
Vezi CWnd::SetTimer.
Daca vrei sa prinzi momentul cand se creaza o fereastra, poti face un (CBT) hook.
Pentru mai multe detalii, vezi SetWindowsHookEx function.
Vezi CWnd::SetTimer.
Daca vrei sa prinzi momentul cand se creaza o fereastra, poti face un (CBT) hook.
Pentru mai multe detalii, vezi SetWindowsHookEx function.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: C++/MFC Detectarea unei ferestre noi
Mersi de raspuns
Daca folosesc SetTimer, ar fi o solutie mai buna sa prind si ferestrele noi fara a se epuiza din resursele calculatorului (cum face while ridica CPU la 100%)?
Daca folosesc SetTimer, ar fi o solutie mai buna sa prind si ferestrele noi fara a se epuiza din resursele calculatorului (cum face while ridica CPU la 100%)?
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: C++/MFC Detectarea unei ferestre noi
Pai, de aia s-au inventat timerele, thread-urile, functiile callback si alte chestii din astea. 

Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: C++/MFC Detectarea unei ferestre noi
Re,
Cu CBT hook si SetWindowsHookEx, nu prea am inteles cum functioneaza,
Ideea sa refreshuesc EnumWindows si/sau EnumChildWindows, ar fi buna, am incercat cu crearea de Threaduri :
EX:
runner *rr = new runner();
rr->start();
void runner::run(){
while(isRunning()){
///////////////////////////////
}
}
Dar imi consuma 20% din procesor, o alta idee ar fi? Imi trebuie ceva dar sa nu imi consume din resursele procesorului!
Imi poti da un exemplu concret cu SetTimer?
Multumesc!
EDIT2:
Am gasit functionarea lui SetTimer:
#define STRICT 1
#include <windows.h>
#include <iostream.h>
VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
cout << "Time: " << dwTime << '\n';
cout.flush();
}
int main(int argc, char *argv[], char *envp[]) {
int Counter=0;
MSG Msg;
UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc);
cout << "TimerId: " << TimerId << '\n';
if (!TimerId)
return 16;
while (GetMessage(&Msg, NULL, 0, 0)) {
++Counter;
if (Msg.message == WM_TIMER)
cout << "Counter: " << Counter << "; timer message\n";
else
cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
DispatchMessage(&Msg);
}
KillTimer(NULL, TimerId);
return 0;
}
Multumesc!
Cu CBT hook si SetWindowsHookEx, nu prea am inteles cum functioneaza,
Ideea sa refreshuesc EnumWindows si/sau EnumChildWindows, ar fi buna, am incercat cu crearea de Threaduri :
EX:
runner *rr = new runner();
rr->start();
void runner::run(){
while(isRunning()){
///////////////////////////////
}
}
Dar imi consuma 20% din procesor, o alta idee ar fi? Imi trebuie ceva dar sa nu imi consume din resursele procesorului!
Imi poti da un exemplu concret cu SetTimer?
Multumesc!
EDIT2:
Am gasit functionarea lui SetTimer:
#define STRICT 1
#include <windows.h>
#include <iostream.h>
VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
cout << "Time: " << dwTime << '\n';
cout.flush();
}
int main(int argc, char *argv[], char *envp[]) {
int Counter=0;
MSG Msg;
UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc);
cout << "TimerId: " << TimerId << '\n';
if (!TimerId)
return 16;
while (GetMessage(&Msg, NULL, 0, 0)) {
++Counter;
if (Msg.message == WM_TIMER)
cout << "Counter: " << Counter << "; timer message\n";
else
cout << "Counter: " << Counter << "; message: " << Msg.message << '\n';
DispatchMessage(&Msg);
}
KillTimer(NULL, TimerId);
return 0;
}
Multumesc!
Re: C++/MFC Detectarea unei ferestre noi
Tie numai asta iti trebuie. Poti adapta asta la clasa dialogului. Aaaa...si incurci varza cu barza, asta nu e MFC 
Daca vrei ca un thread sa nu-ti consume din procesor, pune un sleep micut in el : sleep(20), sleep(500) si gata, e ca un timer
Poti sa nu-ti faci callback-ul ala pt ca ai un mesaj smecher tare : ON_WM_TIMER -----> CDlgDlg::OnTimer( UINT nIDEvent )
Pt asta tre sa folosesti SetTimer cu un eventID in loc de NULL.
Bafta!

Daca vrei ca un thread sa nu-ti consume din procesor, pune un sleep micut in el : sleep(20), sleep(500) si gata, e ca un timer

Code: Select all
#define STRICT 1
#include <windows.h>
#include <iostream.h>
VOID CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT nIDEvent, DWORD dwTime) {
//aici da refresh la ferestre
}
int main(int argc, char *argv[], char *envp[]) {
UINT TimerId = SetTimer(NULL, 0, 500, &TimerProc);
KillTimer(NULL, TimerId); //poti sa faci asta in destructorul clasei dialogului
return 0;
}

Bafta!
Cu stima,
Lupu Claudiu
Lupu Claudiu
topmost, transparenta, hwnd findwindow process
Multumesc tuturor pentru suport,
Am zis sa nu mai fac un alt topic, as mai avea nevoie de inca ceva,
1. Sa trimit catre o fereastra oarecare, gasita prin FindWindow, de ex: transparenta 100%;
2. Sa setez catre o fereastra oarecare, gasita prin FindWindow, tot timpul sa nu isi piarda on top ( sa fie tot timpul focus pe ea, si daca dau click pe alceva );
3. Cum as putea verifica daca HWND gasit prin FindWindow, coincide unui process;
Multumesc!
Am zis sa nu mai fac un alt topic, as mai avea nevoie de inca ceva,
1. Sa trimit catre o fereastra oarecare, gasita prin FindWindow, de ex: transparenta 100%;
2. Sa setez catre o fereastra oarecare, gasita prin FindWindow, tot timpul sa nu isi piarda on top ( sa fie tot timpul focus pe ea, si daca dau click pe alceva );
3. Cum as putea verifica daca HWND gasit prin FindWindow, coincide unui process;
Multumesc!
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: C++/MFC Detectarea unei ferestre noi
M-as fi bucurat sa deschizi nu unul ci trei topicuri noi.
E mai bine ca sa fie topicul si problema decat sa le amestecam pe toate intr-unul singur.
In fine, astea sunt raspunsurile:
E mai bine ca sa fie topicul si problema decat sa le amestecam pe toate intr-unul singur.
In fine, astea sunt raspunsurile:
- Adauga WS_EX_LAYERED la stilul extins apoi cheama CWnd::SetLayeredWindowAttributes.
Code: Select all
CWnd* pWnd = CWnd::FindWindow(_T("Notepad"), NULL); if(NULL != pWnd) { pWnd->ModifyStyleEx(0, WS_EX_LAYERED); BYTE bAlpha = 0; // 100% transparent (255 for 100% opaque) pWnd->SetLayeredWindowAttributes(0, bAlpha, LWA_ALPHA); }
- Chema CWnd::SetWindowPos cu CWnd::wndTopMost.
Code: Select all
CWnd* pWnd = CWnd::FindWindow(_T("Notepad"), NULL); if(NULL != pWnd) { UINT nFlags = SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE; pWnd->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, nFlags); }
- GetWindowThreadProcessId function does the trick:
Code: Select all
CWnd* pWnd = CWnd::FindWindow(_T("Notepad"), NULL); DWORD dwProcessID = 0; DWORD dwThreadID = ::GetWindowThreadProcessId(pWnd->GetSafeHwnd(), &dwProcessID); if(0 != dwThreadID) { // compare whith reference process ID. }
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: C++/MFC Detectarea unei ferestre noi
re:
Am o singura problema cu 2:
Eu folosesc un SetTimer pentru a pune tot timpul FOCUS pe acea fereastra, dar nu reusesc, ce trebuie sa pun in CALLBACK?
Am asa:
CALLBACK >>>
HWND windowHandle = FindWindowA(NULL, "Notepad");
if (windowHandle!=NULL){
//SetWindowPos(windowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE);
//SetWindowPos(windowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOREDRAW | SWP_NOMOVE);
//ShowWindow(windowHandle, SW_RESTORE);
//SwitchToThisWindow(windowHandle, true);
//SetActiveWindow(windowHandle);
//BringWindowToTop(windowHandle);
//SetFocus(windowHandle);
}
Am incercat fiecare varianta, si nu reusesc sa am tot timpul FOCUS pe acea fereastra, desi e pe topmost, dupa ce dau click pe alta fereastra isi pierde focusul....
Am o singura problema cu 2:
Eu folosesc un SetTimer pentru a pune tot timpul FOCUS pe acea fereastra, dar nu reusesc, ce trebuie sa pun in CALLBACK?
Am asa:
CALLBACK >>>
HWND windowHandle = FindWindowA(NULL, "Notepad");
if (windowHandle!=NULL){
//SetWindowPos(windowHandle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE);
//SetWindowPos(windowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOREDRAW | SWP_NOMOVE);
//ShowWindow(windowHandle, SW_RESTORE);
//SwitchToThisWindow(windowHandle, true);
//SetActiveWindow(windowHandle);
//BringWindowToTop(windowHandle);
//SetFocus(windowHandle);
}
Am incercat fiecare varianta, si nu reusesc sa am tot timpul FOCUS pe acea fereastra, desi e pe topmost, dupa ce dau click pe alta fereastra isi pierde focusul....
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: C++/MFC Detectarea unei ferestre noi
Pai daca e topmost nu inseama ca are si tot timpul focusul.
N-o rezolvi nici cu timerul.
La ce-ti trebuie asa ceva? Daca as sti scopul practic/concret, poate as gasi o solutie alternativa.
N-o rezolvi nici cu timerul.
La ce-ti trebuie asa ceva? Daca as sti scopul practic/concret, poate as gasi o solutie alternativa.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Re: C++/MFC Detectarea unei ferestre noi
Dupa cum spuneam vreau sa dezvolt o aplicatie prin care imi afiseaza toate ferestrele deschise, pe langa aceasta, vreau sa am mai multe atribuite fiecarei ferestre, cat timp aplicatia mea ruleaza ce atribuite ii dau unei ferestre oarecare din lista, sa functioneze corect.
-> Un exemplu mai concret ar fi, setez aplicatia sa functioneze pe o anumita fereastra, dupa ce apare fereastra pentru a introduce o parola (gen folder lock), dar in acelasi timp primesc un mesaj pe yahoo (isi pierde din focus, tipic), dupa ce am introdus parola, nu mai am nevoie de FULL FOCUS pe acea fereastra.
PS: Daca chiar nu merge atunci renunt la chestia cu full focus!
Mersi pentru suport!
-> Un exemplu mai concret ar fi, setez aplicatia sa functioneze pe o anumita fereastra, dupa ce apare fereastra pentru a introduce o parola (gen folder lock), dar in acelasi timp primesc un mesaj pe yahoo (isi pierde din focus, tipic), dupa ce am introdus parola, nu mai am nevoie de FULL FOCUS pe acea fereastra.
PS: Daca chiar nu merge atunci renunt la chestia cu full focus!
Mersi pentru suport!
Re: C++/MFC Detectarea unei ferestre noi
Incearca asa:
Este o problema pe os > XP, trebuie sa dai focus la fereastra inainte s-o faci topmost.BTW: poti sa scoti si SWP_NOREDRAW.
L.E. E de ajuns sa apelezi asta numai o data. Daca o faci cum trebuie fereastra ramane tot timpul topmost.
Code: Select all
HWND windowHandle = FindWindowA(NULL, "Notepad");
if (windowHandle!=NULL){
SetFocus(windowHandle);
BringWindowToTop(windowHandle);//cu asta sau fara asta
SetWindowPos(windowHandle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOREDRAW | SWP_NOMOVE);
}
L.E. E de ajuns sa apelezi asta numai o data. Daca o faci cum trebuie fereastra ramane tot timpul topmost.
Last edited by bu7ch3r on 21 Feb 2012, 14:55, edited 1 time in total.
Cu stima,
Lupu Claudiu
Lupu Claudiu
Re: C++/MFC Detectarea unei ferestre noi
Code: Select all
UINT nFlags = SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE;
pWnd->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, nFlags);

Cu stima,
Lupu Claudiu
Lupu Claudiu
- Ovidiu Cucu
- Fondator
- Posts: 3778
- Joined: 11 Jul 2007, 16:10
- Judet: Iaşi
- Location: Iasi
- Contact:
Re: C++/MFC Detectarea unei ferestre noi
Nu, de ce sa fie ignorat?bu7ch3r wrote:Am impresia ca daca pui SWP_NOACTIVATE ca flag wndTopMost e ignorat...Code: Select all
UINT nFlags = SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE; pWnd->SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, nFlags);
?
Daca pun HWND_TOPMOST respectiv CWnd::wndTopMost, atunci fereastra devine topmost oricum, adica sta tot timpul in fata celorlalte fereste non-topmost (care n-au stilul WS_EX_TOPMOST).
Daca pun si flag-ul SWP_NOACTIVATE atunci nu este activata, adica daca initial era inactiva, ramane tot asa.
Ovidiu
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
Follow http://twitter.com/#!/ovidiucucu
Weblog: http://codexpert.ro/blog/author/ovidiu-cucu/
Visit FAQ, Tips & Tricks
- cristianamarie
- Membru++
- Posts: 480
- Joined: 12 Mar 2009, 18:47
- Judet: Iaşi
- Location: Iasi
Re: C++/MFC Detectarea unei ferestre noi
Topmost nu are neaparat focus. Un dialog de Find poate fi topmost in timp ce focusul e in document.
Nuclear launch detected