Avatar billede killer_bee Nybegynder
17. april 2002 - 09:34 Der er 48 kommentarer og
2 løsninger

Process window handle

Hej alle.

Jeg har oprettet spørgsmålet før og har fået et svar somkan bruges(men ik altid )
så kig lige her http://www.eksperten.dk/spm/196344 .

Problemet er  at navnet på vinduet er ik konstant. Så jeg har brug for en metode som kan få fat i window handle til en anden process ud fra f.eks exe name?

Nogle forslag?
Avatar billede wisen Nybegynder
17. april 2002 - 09:37 #1
... Er det et bestemt vindue du skal have fat i, og er det altid det samme ?
Avatar billede killer_bee Nybegynder
17. april 2002 - 09:51 #2
Jeg skal finde ud af om den applikation jeg starter er startet allerede .. hvis ja så skal jeg sætte den i focus og lade være med at starte den ny applikation.
som sagt vinduets navn er ik det samme altid
Avatar billede killer_bee Nybegynder
17. april 2002 - 09:55 #3
Kig på vinduet vi snakker i.. caption på den hedder :
Eksperten < Programmering : C/C++ : Process window handle >
'Process window handle' <-- er unik for lige denne vindu som jeg ikke kan ane noget om når jeg starter en ny exsplorer...
Forstår du hva jeg mener?
Avatar billede laffe Nybegynder
17. april 2002 - 10:03 #4
Hvilket styresystem skal det køre på 98 nt 2000 ?
Avatar billede killer_bee Nybegynder
17. april 2002 - 10:09 #5
alle (helst)
Avatar billede laffe Nybegynder
17. april 2002 - 10:09 #6
Du kan bruge FindWindow.

HWND FindWindow(
    LPCTSTR lpClassName,    // pointer to class name
    LPCTSTR lpWindowName     // pointer to window name
  );

Du skal angive lpCLassName, istedet for lpWindowName.

I min kode kalder jeg:

HANDLE H = FindWindow("TMXCP_MAIN_FORM","");
Avatar billede killer_bee Nybegynder
17. april 2002 - 10:57 #7
prøver lige
Avatar billede killer_bee Nybegynder
17. april 2002 - 11:20 #8
TMXCP_MAIN_FORM hvor har du det fra?? min app hedder testerrad.. hva er class name for den?? noget jeg selv skal definere?? eller er det CTesterradApp...
Avatar billede laffe Nybegynder
17. april 2002 - 11:24 #9
ClassName er navnt på den type dit MainWindow er lavet af.

I CBuilder er det simpelthen  navnet på min classe.

class TMXCP_MAIN_FORM : public TForm
{
etc.
etc.
etc.

Hvis du bruger Visual C++, så må der også være en måde hvorpå man kan angive en ClassName på. Jeg undersøger det lige.
Avatar billede killer_bee Nybegynder
17. april 2002 - 11:25 #10
Det skal helst laves sådan at det er en uafhængi funktion .. altsa ikke noget Fast input .. hellere noget i stil med Find Window(variable,"")
Avatar billede laffe Nybegynder
17. april 2002 - 11:26 #11
Class name er ikke variable.
Avatar billede killer_bee Nybegynder
17. april 2002 - 11:29 #12
Det jeg har lavet er en MFC app.. som selv laver følgende klasser..
class CTesterradDlg : public CDialog
class CTesterradApp : public CWinApp

Jeg har prøvet at bruge de navne uden held..
Avatar billede laffe Nybegynder
17. april 2002 - 11:32 #13
ClassName er et felt i WNDCLASS strukturen.

Jeg fandt det her:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemfc/htm/cwnd_29.asp
Avatar billede killer_bee Nybegynder
17. april 2002 - 11:37 #14
Ja men jeg har den kode .. men Jeg er ik helt sikker på hvad der skal stå istedet for MyClassName.. fordi jeg har prøvet med de ovennævnte og den kan ikke finde dem..
Avatar billede wisen Nybegynder
17. april 2002 - 11:38 #15
Du kan bruge "GetClassName()" til at få fat i din dialog's classname...
Avatar billede killer_bee Nybegynder
17. april 2002 - 12:00 #16
Jeg har prøvet GetClassName... men Jeg checker om app er der for tidlig tror jeg.. jeg har prøvet med følgende variabler for at angive HWND handle : theApp.m_pMainWnd->m_hWnd  og  theApp.m_pActiveWnd->m_hWnd.
Men den gider ikke at godtage den.. compiler brokker sig..
Avatar billede killer_bee Nybegynder
17. april 2002 - 12:03 #17
Jeg gør dette helt i starten i InitInstance()...
Avatar billede wisen Nybegynder
17. april 2002 - 12:26 #18
Ja, men classnamet skulle gerne vær konstant, så det er faktisk kun at få fat i det een gang. MFC laver noget sindrigt noget når der tildeles classnames, så det er ikke så indlysende....
Avatar billede killer_bee Nybegynder
17. april 2002 - 12:31 #19
Ja.. jeg fatter ikke hva der sker....
Avatar billede wisen Nybegynder
17. april 2002 - 12:37 #20
Alle vinduer har en "klasse" som de er en instans af. Den skal registreres ved Windows, hvorefter man kan instantiere dem. Alt det gør MFC for dig. Problemet er, at få fat i det classname som er blevet tildelt. Det kan man så bruge "GetClassName" til...
Avatar billede killer_bee Nybegynder
17. april 2002 - 12:48 #21
Man må sku da kunne at få fat i den F***** class name!. GRR :)
Avatar billede laffe Nybegynder
17. april 2002 - 12:51 #22
Måske skal du selv registrere classname med: RegisterClassName()
Avatar billede killer_bee Nybegynder
17. april 2002 - 12:53 #23
Det er jo for langt ude..
Avatar billede laffe Nybegynder
17. april 2002 - 12:57 #24
Velkommen til Windows's forunderlige verden haha ;-)
Avatar billede killer_bee Nybegynder
17. april 2002 - 14:53 #25
Er der virkelig ik nogen som ve dhvordan man kan få fat i classname af en app i starten af InitInstance() funktionen..

P.S. F*** Bill Gates
Avatar billede wisen Nybegynder
17. april 2002 - 15:09 #26
Prøv, for at få classnamet at sætte en "GetClassName" ind i din dialogs "OnInitDialog". Efter du har dit classname, kan du slette koden igen, og vupti :)
Avatar billede killer_bee Nybegynder
18. april 2002 - 08:40 #27
wisen >> det er ikke sikkert at jeg har en dialog .. det app jeg arbejder med lige nu er 'view med documenter'... det skal være en universal måde at gøre det på...
Avatar billede laffe Nybegynder
18. april 2002 - 08:48 #28
Jeg har et nyt forslag:
gør 3 ting:

1. Kald GetModuleHandle("c:\......") for at få en HINSTANCE af den application du vil have fat i.

2. Kald GetClassInfo med den HINSTANCE du lige har fået. Denne returnerer en classname

3. Kald nu FindWindow for at få en ahndle til vinduet.
Avatar billede laffe Nybegynder
18. april 2002 - 08:49 #29
2. Kald GetClassInfo med den HINSTANCE du lige har fået. Denne returnerer bland andet en classname
Avatar billede killer_bee Nybegynder
18. april 2002 - 09:16 #30
hInstance
[in] Handle to the instance of the application that created the class. To retrieve information about classes defined by the system (such as buttons or list boxes), set this parameter to NULL.
lpClassName
[in] Pointer to a null-terminated string containing the class name. The name must be that of a preregistered class or a class registered by a previous call to the RegisterClass or RegisterClassEx function.


I GetClassInfo nr to parametr skal være ClassName som jeg ik kender ..
Avatar billede laffe Nybegynder
18. april 2002 - 09:18 #31
Der var jeg vist lidt for hurtig... sorry :)
Avatar billede killer_bee Nybegynder
18. april 2002 - 09:27 #32
np da :)
Avatar billede killer_bee Nybegynder
18. april 2002 - 09:42 #33
Jeg tror jeg lukker nu.. det er nok umuligt at få fat i ClassName hvis man ik har registreret den først .. se her:
lpClassName
[in] Pointer to a null-terminated string that specifies the class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in the low-order word of lpClassName; the high-order word must be zero.
If lpClassName points to a string, it specifies the window class name. The class name can be any name registered with RegisterClass or RegisterClassEx, or any of the predefined control-class names.

Det er i FindWindow funktionen .. så jeg må leve med at man ik kan finde den f***** class name. Jeg ved jo ik om folk registrerer deres classname..
Avatar billede killer_bee Nybegynder
18. april 2002 - 09:47 #34
Men jeg vil give lidt af pointerne for jeres indsats..
Avatar billede wisen Nybegynder
18. april 2002 - 09:49 #35
... Lad os lige prøve igen, forfra :) Hvad er det for nogle vinduer du skal have fat i ?
Avatar billede laffe Nybegynder
18. april 2002 - 09:51 #36
Ja det det kan fanme ikke passe, at det ikke kan løses....
Avatar billede killer_bee Nybegynder
18. april 2002 - 10:00 #37
Ok...

Scenario 1:

Jeg har en applikation kørende ... lad os kalde den Tester + bruger.
bruger kan være forskelllige.

F.eks. Kig på vinduet vi snakker i.. caption på den hedder :
Eksperten < Programmering : C/C++ : Process window handle >
'Process window handle' <-- er unik for lige denne vindu som jeg ikke kan ane noget om når jeg starter en ny exsplorer...

Dvs. Jeg kan have at min app hedder noget som jeg ikke kan få fat i fordi jag vil checke om den app kører i forvejen tidlig i forløbet , altså i Intit funktionen. Jeg har prøvet mig frem med at bruge theApp.m_pszAppName variablen .. men det er en begrensning fordi vinduets titel kan ændres runtime den er jo ikke fast.
Derfor ville jeg have et konstant variabel som er unik lige for denapp ..
Avatar billede killer_bee Nybegynder
18. april 2002 - 10:06 #38
Den måde jeg gør dette på er..
1) når jeg starter en app sætter jeg en semafor op.. næste gang checker jeg om semaforen er der, hvis ja så sopper jeg appen. Det funker fint MEN det ekstra feature jeg vil ha er at istedet for bare luk 'den nye app' vil jeg maksimere/focusere den allerede kørende app.
Hvis jeg bare kunne sige noget i still med:
Hvem har sat semaforen ? ---> Maksimer ham.
Avatar billede killer_bee Nybegynder
18. april 2002 - 10:08 #39
Kan man få fat i window handle ud fra en semafor?? Det f***** windows må da vide hvem har sat semaforen. ellers ville det jo være kaos
Avatar billede laffe Nybegynder
18. april 2002 - 10:14 #40
Ok. hvad med at sende en broadcast message til ALLE vinduer, med din egen WM_xxx message. Denne WM_xxx message lytter du så efter i den app som du vil makimere.

F.eks:

SendMessage(HWND_BROADCAST,WM_MAXIMER_MIT_VNDUE,0,0);

Det er ikke elegant, men .......
Avatar billede killer_bee Nybegynder
18. april 2002 - 10:16 #41
Som du siger .. meatball programering.. nææ..
Avatar billede wisen Nybegynder
18. april 2002 - 10:48 #42
Hmm, her ( http://codeguru.earthweb.com/misc/single_instance.shtml ) står der bla.

The class string is used as a means of finding the main window of the application. It is created by taking the name of the application (pulled from the resource string) and appending " Class" to the end. Simple but effective. It gets attached to the main window during the main frame&#8217;s PreCreateWindow() function. When we want to find the window, we use FindWindowEx() with the class string.
Avatar billede wisen Nybegynder
18. april 2002 - 10:49 #43
Avatar billede wisen Nybegynder
18. april 2002 - 10:50 #44
Avatar billede killer_bee Nybegynder
18. april 2002 - 11:43 #45
wisen jeg tror den kan bruges.. men det er for latterligt at man ik kan gøre det nemmere... Tja.. Jeg vil takke jer begge for de gode svar/forslag.. wisen smid lige en svar så jeg kan delle point til jer begge. Tak igen :o)
Avatar billede wisen Nybegynder
18. april 2002 - 12:20 #46
1. stk svar, heading your way :)
Avatar billede wisen Nybegynder
18. april 2002 - 12:20 #47
DOH !
Avatar billede killer_bee Nybegynder
18. april 2002 - 12:32 #48
Nogle point heading your way.
Uden DOH :o)
Avatar billede wisen Nybegynder
18. april 2002 - 13:13 #49
Takker :)
Avatar billede laffe Nybegynder
18. april 2002 - 13:15 #50
Takker også. Godt gået Wisen....
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester