UNE FENÊTRE QUI SE SAUVE QUAND ON PASSE DESSUS, STOPPE CTRL-ALT-SUP

Signaler
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Messages postés
1
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
6 avril 2004
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/19804-une-fenetre-qui-se-sauve-quand-on-passe-dessus-stoppe-ctrl-alt-sup

Messages postés
1
Date d'inscription
lundi 1 mars 2004
Statut
Membre
Dernière intervention
6 avril 2004

lut !
je cherche un truc similaire : il faut que je fasse une barre d'outil qui se trouve à gauche d'une fenêtre (un peu comme dans Acrobat Reader) qui se cache quand elle est inactive et qui s'agrandit quand on pointe le curseur dessus.
J'ai un début de code qui utilise un Tab ainsi que les méthodes que tu as données.
Malheureusement ça marche pas 'top' surtout la perte de focus. Mais je suis un débutant de chez débutant (quelques semaines) et je sais pas trop quels évènement je doit gérer pour améliorer le système de focus...

#include <windows.h> //include all the basics
// (must link with comctl32.lib)
#include <commctrl.h>


//declare the Window procedure where all messages will be handled
LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam);

//declare some global variables
HINSTANCE g_hInst; //application instance
HWND g_hwndTabCntrl; //handle to tab common control
BOOL hidden;

//=========================================================================================
//declare the Window procedure where all messages will be handled
LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam);
//=========================================================================================

//start the application; all win32 applications require a WinMain function
//that the windows operating system looks for as an entry point to that application
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HWND hwnd; //the wnd handle
MSG Msg; //a simple structure for storing message information
HICON hIcon; //window icon
HCURSOR hCursor; //window cursor
//declare and initialise wnd registration information variables
TCHAR chClassName[]=TEXT("SIMPLEWND");
WNDCLASSEX wcx; //this structure is used for storing information about the wnd 'class'
g_hInst=hInstance; //store the application instance
//use 'LoadImage' to load wnd class icon and cursor as it supercedes the obsolete functions
//'LoadIcon' and 'LoadCursor', although these functions will still work. Because the icon and
//cursor are loaded from system resources ie they are shared, it is not necessary to free the
//image resources with either 'DestroyIcon' or 'DestroyCursor'.
hIcon=(HICON)LoadImage(0,IDI_APPLICATION,IMAGE_ICON,0,0,LR_SHARED);
hCursor=(HCURSOR)LoadImage(0,IDC_ARROW,IMAGE_CURSOR,0,0,LR_SHARED);
wcx.cbSize = sizeof(WNDCLASSEX); //byte size of WNDCLASSEX struct
wcx.style = CS_HREDRAW|CS_VREDRAW; //ensure wnd is always redrawn
wcx.lpfnWndProc = (WNDPROC)WndProc; //pointer to the Window Procedure
wcx.cbClsExtra = 0; //Extra bytes for 'class' wnds
wcx.cbWndExtra = 0; //Extra bytes for this wnd
wcx.hInstance = hInstance; //Application instance
wcx.hIcon = hIcon; //Application icon
wcx.hCursor = hCursor; //Cursor for wnd
wcx.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); //Background wnd colour
wcx.lpszMenuName = NULL; //Name of wnd menu
wcx.lpszClassName = chClassName; //Name of this wnd 'class'
wcx.hIconSm = NULL; //Icon in top-left corner of wnd

//Register the wnd class with the Windows system
if (!RegisterClassEx(&wcx))
{
//Registration has failed so inform the user
MessageBox( NULL,
TEXT("Failed to register wnd class"),
TEXT("ERROR"),
MB_OK|MB_ICONERROR);
return FALSE;
}
//create wnd of the 'class' just registered
hwnd=CreateWindowEx(WS_EX_TOOLWINDOW, //more or 'extended' styles = 0 WS_EX_TOOLWINDOW
chClassName, //the 'class' of window to create
TEXT("Common Controls - Tab"), //the window title
WS_TILED, //window style: how it looks
GetSystemMetrics(SM_CXSCREEN)/4, //window position: left
GetSystemMetrics(SM_CYSCREEN)/4, //window position: top
GetSystemMetrics(SM_CXSCREEN)/2, //window width
GetSystemMetrics(SM_CYSCREEN)/2, //window height
NULL, //parent window handle
NULL, //handle to this windows's menu
hInstance, //application instance
NULL); //user defined information
if (!hwnd)
{
//wnd creation has failed so inform the user
MessageBox( NULL,
TEXT("Failed to create wnd"),
TEXT("ERROR"),
MB_OK|MB_ICONERROR);
return FALSE;
}

MoveWindow(hwnd,
-120, // caché -120, affiché 0
GetSystemMetrics(SM_CXSCREEN)/8,
150,
513,
TRUE);

//Display the wnd
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
//start message loop
while (GetMessage(&Msg,NULL,0,0)>0)
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam;
}


LRESULT CALLBACK WndProc(HWND hwnd,UINT Message,WPARAM wParam,LPARAM lParam)
{
switch (Message)
{
case WM_CREATE:
{
INITCOMMONCONTROLSEX iccx;
TCITEM tabPage;
//first load in the common controls dll, specifying the tab control wnd class
iccx.dwSize=sizeof(INITCOMMONCONTROLSEX);
iccx.dwICC=ICC_TAB_CLASSES; //ICC_WIN95_CLASSES can also be used if tooltips not required for tab
InitCommonControlsEx(&iccx);
//create a tab control - its dimensions are set by the parent wnd in the WM_SIZE handler
g_hwndTabCntrl=CreateWindowEx(0, //more or 'extended' styles
WC_TABCONTROL, //the 'class' of window to create
NULL, //the window title
WS_CHILD|WS_VISIBLE| //window style: how it looks
TCS_FIXEDWIDTH|TCS_VERTICAL|
TCS_SINGLELINE|TCS_RIGHT,
0, //window position: left
0, //window position: top
0, //window width
0, //window height
hwnd, //parent window handle
NULL, //handle to this windows's menu
g_hInst, //application instance
NULL); //user defined information
//setup and attach some tab pages
ZeroMemory(&tabPage,sizeof(TCITEM));
tabPage.mask=TCIF_TEXT;
tabPage.pszText=TEXT("First Page");
tabPage.cchTextMax=lstrlen(tabPage.pszText);
SendMessage(g_hwndTabCntrl,TCM_INSERTITEM,0,(LPARAM)&tabPage);
tabPage.pszText=TEXT("Second Page");
tabPage.cchTextMax=lstrlen(tabPage.pszText);
SendMessage(g_hwndTabCntrl,TCM_INSERTITEM,1,(LPARAM)&tabPage);
tabPage.pszText=TEXT("Third Page");
tabPage.cchTextMax=lstrlen(tabPage.pszText);
SendMessage(g_hwndTabCntrl,TCM_INSERTITEM,2,(LPARAM)&tabPage);
tabPage.pszText=TEXT("Fourth Page");
tabPage.cchTextMax=lstrlen(tabPage.pszText);
SendMessage(g_hwndTabCntrl,TCM_INSERTITEM,3,(LPARAM)&tabPage);
tabPage.pszText=TEXT("Fifth Page");
tabPage.cchTextMax=lstrlen(tabPage.pszText);
SendMessage(g_hwndTabCntrl,TCM_INSERTITEM,4,(LPARAM)&tabPage);
//set the font of the tabs to a more typical system GUI font
SendMessage(g_hwndTabCntrl,WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT),0);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0); //signal end of application
return 0;
}
case WM_SIZE:
{

//resize tab common control so that it always fills parent's client area
MoveWindow(g_hwndTabCntrl,2,2,LOWORD(lParam)-4,HIWORD(lParam)-4,TRUE);
return 0;

}
// WM_MOUSEMOVE & WM_KILLFOCUS
case WM_MOUSEMOVE:
{
if(hidden)
{
MoveWindow(hwnd,
0, // caché -120, affiché 0
GetSystemMetrics(SM_CXSCREEN)/8,
150,
513,
TRUE);
hidden=FALSE;
}
return 0;
}
case WM_KILLFOCUS:
{
if(!hidden)
{
MoveWindow(hwnd,
-120, // caché -120, affiché 0
GetSystemMetrics(SM_CXSCREEN)/8,
150,
513,
TRUE);
hidden=TRUE;
}
}
default:
return DefWindowProc(hwnd,Message,wParam,lParam); //let system deal with msg
}
}
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
Ton case WM_KILLFOCUS est aleatoire. Si on met le focus sur un notepad par exemple, on a tout loisir d'ouvrir ensuite le taskmanager et de killer ton processus.
Faut HOOKer le taskmanager a sa creation de fenetre pour etre certain de l'avoir.
Execute une seule fois GetModuleFileName a l'ouverture et sors szEXE[256]; de WinMain, inutile de repeter cet appel.
Taskmanager change de titre suivant la langue locale, faudra penser a ce genre de choses.
Pour une 1ere, c'est pas mal. Faudra passer a du plus constructif pour la suite.
ciao...