PDA

Visualizza versione completa : no window - C/C++


NS-1
15-09-2004, 16.06.59
ciao,

vorrei che il mio programmino lavorasse senza essere visibile... (senza form, finestre console, etc...)

potete darmi una mano?

grazie

Alhazred
15-09-2004, 16.34.15
BOOL SetWindowPos(
HWND hWnd, // handle to window
HWND hWndInsertAfter, // placement-order handle
int X, // horizontal position
int Y, // vertical position
int cx, // width
int cy, // height
UINT uFlags // window-positioning flags
);

In uFlags prova ad usare SWP_HIDEWINDOW o SWP_NOACTIVATE

NS-1
15-09-2004, 17.22.21
grazie ma non funziona... :(

questo è il mio esperimento:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

main(){

void *ptr[10000];
int cicli, mem = 102400, flag = 1;
HWND hMiaFinestra;

SetConsoleTitle("Swap");

hMiaFinestra = FindWindow("ConsoleWindowClass", "Swap");

SetWindowPos(hMiaFinestra, HWND_BOTTOM, 0, 0, 0, 0, 0x0080); // 0x0080 --> SWP_HIDEWINDOW

while(flag){

for(cicli = 0; ptr[cicli] != NULL; cicli++)
ptr[cicli] = malloc(mem);

for(; cicli >= 0; cicli--)
free(ptr[cicli]);

}

return 0;
}


cosa c'è che non va? :wall:

Alhazred
15-09-2004, 18.17.21
Invece di
hMiaFinestra = FindWindow("ConsoleWindowClass", "Swap");

prova
hMiaFinestra = FindWindow(NULL, "Swap");

Non va neanche con SWP_NOACTIVATE?

Alhazred
15-09-2004, 18.28.27
#include <stdio.h>
#include <windows.h>

main(){
int cicli=0;
HWND hWnd;

SetConsoleTitle("Swap");

hWnd = FindWindow(NULL, "Swap");

SetWindowPos(hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOACTIVATE);

for(cicli=0; cicli<5; cicli++)
printf("funzionera'?\n");
return 0;
}

Così la finestra compare subito come se fosse ridotta ad icona e non c'è modio di ingrandirla.

LoryOne
16-09-2004, 08.09.42
Non c'è nulla che non va, semplicemente non è main() che deve essere invocato, esso infatti impartisce al S.O di predisporre e visualizzare una finestra di console e procedere con l'esecuzione del codice all'interno di essa.

L'API SetWindowPos viene eseguita regolarmente in quanto anche la console è una finestra ed anch'essa ha un handle.

La funzione principale main() dovrà essere sostituita dall'equivalente int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdParam, int nCmdShow)...

NS-1
16-09-2004, 19.32.56
quindi sostituisco solo main() con ciò che hai messo tu?
non è la prima volta che vedo questa dichiarazione, a cosa serve? che differenza c'è?

grazie...

NS-1
16-09-2004, 19.38.18
output:

Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/prova.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

prova.exe - 2 error(s), 0 warning(s)

NS-1
16-09-2004, 19.47.21
..sempre il solito discorso, se creo un nuovo progetto "Win32" tutto ok...

mi spieghereste cmq le differenze tra main() e l'APIENTRY WINMAIN?

LoryOne
16-09-2004, 20.47.36
Dipende tutto dal progetto che devi creare.

Quando crei un progetto Win32,il compilatore sa che deve creare un applicativo che avrà l'interfaccia grafica di Windows ma è il programmatore ad impartire le direttive per impostarne le proprietà e gestirne/intercettarne i messaggi.
In questo modo hai il controllo completo sull'interfaccia grafica dell'applicativo
In questo caso è come se impartissi al compilatore di creare una finestra che non è una console e ti basterà nno richiamare l'API ShowWindow dopo la registrazione della classe el'impostazione delle rudimentali proprietà della finestra stessa.

Quando crei un progetto console,il compilatore sa che dovrà far apparire una finestra di emulazione DOS e che quindi il tuo applicativo sarà un programma DOS.
In questo caso, però, la funzione main() invocherà l'API apposita per creare una finestra console e procedere con l'esecuzione del programma.
Attento che, a causa di quanto sopra riportato, il prodotto compilato potrà esclusivamente essere eseguito sotto Windows in emulazione DOS.

Guarda qui:
http://www.winprog.org/tutorial/
per avere un quadro completo su come operare a basso livello su una finestra di Windows.

Ps: Occhio che nel primo caso, anche se la finestra non è visibile, l'intercettazione della coda dei messaggi (cosa che ti sarà chiara dopo aver letto la guida) è attiva. Per chiudere l'apllicativo, quindi, dovrai impartire il messaggio di chiusura (SendMessage(...)) per simulare la pressione del mouse sul pulsante di chiusura della finestra.

NS-1
17-09-2004, 14.41.18
Grazie di tutto Lory (Y),
grazie anche a te Alhazred... :D