IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

[Windows API] Accèder aux ToolTips à partir des Handles de fenêtres


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut [Windows API] Accèder aux ToolTips à partir des Handles de fenêtres
    Bonjour,

    Je cherche à accèderr aux textes des ToolTips à partir des handles de fenêtres. J'aimerais bien au final coder l'ensemble en VBA, mais je ne doute pas avoir davantage de changes sur un forum de C++.

    Je me perds un peu concernant les messages (WM_NOTIFY,..), les structures (NMHDR, NMTOOLTIPSCREATED qui semble contenir un pointeur vers le handle de la fenêtre ToolTip,...) et les notifications (NM_TOOLTIPSCREATED,..) qui pourraient être utilies.

    Ci-dessous le bout de code que j'ai composé au gré de mes recherches sur internet (n'étant pas un expert en C++ ) où j'ai créé un p'tit formulaire sous Excel en VBA avec un bouton ayant un ToolTip en guise de cobaye :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    #include <windows.h>
    #include <tchar.h>
    #include <commctrl.h>
    #include <iostream>
    #include <string>
     
    int main()
    {
     
    	HWND hwndParent;
    	HWND hwnd;
     
    	//UserForm créé sous Excel en VBA avec un simple CommandButton contenant un ControlTipText
    	hwndParent = FindWindow(L"ThunderDFrame", L"UserForm1"); 
     
    	hwnd = FindWindowEx(hwndParent, NULL, NULL, NULL);
     
    	std::wcout << "hwnd = " << hwnd << " and hwndParent = " << hwndParent << std::endl;
     
    	TCHAR className[255] = _T(""); 
     
    	GetClassName(hwnd, className, 255);
     
    	std::wcout << "claaName = " << className << std::endl; // -> "F3 Server 33180000"
     
    	std::wcout << "GetDlgCtrlID(hwnd) = " << GetDlgCtrlID(hwnd) << std::endl; // -> 0 (il me semble que ça correspond à une erreur, sans pour autant être sûr)
     
    	std::wcout << "GetWindowLong(hWnd, GWL_ID) = " << GetWindowLong(hwnd, GWL_ID) << std::endl; // -> 0 aussi
     
    	/*-------------------------------------------------*/
     
    	NMHDR nmh;
    	nmh.code = NM_TOOLTIPSCREATED; //Arithmetic overflow...
    	nmh.idFrom = GetDlgCtrlID(hwnd); //UNIT_PTR
    	nmh.hwndFrom =hwndParent;
     
    	std::wcout << "SendMessage = " << SendMessage(hwndParent, WM_NOTIFY, nmh.idFrom, (LPARAM)& nmh) << std::endl;
     
    	//...
     
    	/*-------------------------------------------------*/
     
      	system("pause");
     
    	return 0;
    }
    Pouvez-vous m'aider à ce sujet ?

    Merci par avance !

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Pour une raison qui m'échappent, l'example du formulaire VBA ne me permet pas d'accèder à la fenêtre du boutton. Du coup, je me suis décidé à créer un bouton avec tooltip en C++, mais je parviens pas à triggerer (du coup, ça passe par le call back ) le tooltip... Pouvez-vous m'aider à corriger le code suivant (inspiré d'exemples de divers forums) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    #ifndef UNICODE
    #define UNICODE
    #endif 
     
    #include <windows.h>
    #include <commctrl.h.>
     
    LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM);
     
    HINSTANCE hInst;
     
    int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
    {
    	hInst = hInstance;
     
    	// Register the window class.
    	const wchar_t CLASS_NAME[] = L"Basic Window Class";
     
    	WNDCLASS wc = { };
    	// UNIT    style
    	wc.lpfnWndProc = WindowProc;   // WNDPROC
    	// int     cbClsExtra
    	// int     cbWndExtra
    	wc.hInstance = hInstance;      // HINSTANCE
    	// HICON   hIcon
    	// HCURSOR hCursor
    	// HBRUSH  hbrBackground
    	// LPCSTR  lpzMenuName
    	wc.lpszClassName = CLASS_NAME; // LPCSTR
     
    	RegisterClass(&wc);
     
    	HWND hWnd = CreateWindowEx(
    		NULL,
    		CLASS_NAME,                       // LPCWSTR   lpClassName
    		L"This is a basic windows",       // LPCWSTR   lpWindowName
    		WS_OVERLAPPEDWINDOW,              // DWORD     dwStyle
    		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,// Size and position
    		NULL,				              // HWND      hWndParent    
    		NULL,				              // HMENU     hMenu
    		hInstance,			              // HINSTANCE hInstance
    		NULL				              // LPVOID    lpParam
    	);
     
    	ShowWindow(hWnd, nCmdShow);
    	UpdateWindow(hWnd);
     
    	// message loop
    	MSG msg;
     
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
     
    	return 0;
    }
     
    LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    	switch (uMsg)
    	{
     
    	case WM_CREATE:
    	{
    		HWND hWndButton = CreateWindowEx(
    			NULL,
    			L"Button",
    			L"This is a button",
    			WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
    			10, 10, 150, 75,
    			hwnd,
    			NULL,
    			hInst,
    			NULL
    		);
     
    		//InitCommonControls();
     
    		//InitCommonControlsEx(
    		//	// INTICOMMONCONTROLSEX * picce
    		//);
     
    		HWND hWndToolTip = CreateWindowEx(
    			NULL,
    			TOOLTIPS_CLASS,
    			NULL,
    			WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
    			CW_USEDEFAULT, CW_USEDEFAULT,
    			CW_USEDEFAULT, CW_USEDEFAULT,
    			hWndButton,
    			NULL,
    			hInst,
    			NULL
    		);
     
    		RECT rect;
    		GetClientRect(hWndToolTip, &rect);
     
    		TOOLINFO toolInfo;
    		toolInfo.cbSize = sizeof(TOOLINFO);
    		toolInfo.hwnd = hWndButton;
    		toolInfo.hinst = hInst;
    		toolInfo.uFlags = TTF_SUBCLASS; //TTF_IDISHWND | TTF_SUBCLASS;
    		toolInfo.uId = 0; //(UINT_PTR)hWndToolTip;
    		toolInfo.lpszText = (LPWSTR) L"This is a basic Tool tip";
    		toolInfo.rect.left = rect.left;
    		toolInfo.rect.top = rect.top;
    		toolInfo.rect.right = rect.right;
    		toolInfo.rect.bottom = rect.bottom;
     
    		if (!SendMessage(hWndToolTip, TTM_ADDTOOL, 0, (LPARAM)& toolInfo)) MessageBox(NULL, (LPCWSTR) L"Oups", NULL, NULL);
     
    		return 0;
    	}
     
    	case WM_DESTROY:
    	{
    		PostQuitMessage(0);
    		return 0;
    	}
     
    	}
    	return DefWindowProc(hwnd, uMsg, wParam, lParam);
     
    }
    Bien sûr il faut que ce soit le plus simple (pas de MFC, ATL,...)

    Merci

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 20
    Points : 47
    Points
    47
    Par défaut
    Si j'ai bien saisi ton problème :

    Dans ton tout premier CreateWindow, tu passes 'hInstance' en tant que module à associer à la fenêtre. Si bien que la fenêtre est liée à ton instance d'application et disparaît en même temps que celle-ci.

    Aussi, remplace hInstance par NULL et tu devrais être capable d’interagir avec ta fenêtre.

    EDIT : Ok, en relisant je finis par comprendre. Aucun rapport donc.

    J'ai trouvé un exemple où tout est géré dans le WM_CREATE pour éviter de s'éparpiller en code : https://chgi.developpez.com/windows/tooltips/

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Je pensais à un miracle en lisant les premières lignes de ton message ... merci en tout cas pour ton aide. Disons que mon second message était quelque peu détourné de mon problème initial, mais je vois ça plutôt comme une étape incontournable à résoudre.

    Malheureusement, l'exemple du lien ne fonctionne pas... Outre quelques Casts manquants, ça ne passe pas. C'est vrai que j'ai oublié de préciser que je suis sous Visual Studio Community 2019 (16.15). Bon OK, j'avoue ne pas encore avoir osé m'aventurer dans toutes les options de paramétrages.

    Je pense que la fonction InitCommonControls() pose problème, car en la mettant, j'obtiens des problèmes de linker et en la m'étant, SendMessage(hWndToolTip, TTM_ADDTOOL, 0, (LPARAM)& toolInfo) retourne 0... J'imagine que le problème se situe entre ces lignes... D'ailleurs, InitCommonControls() semble avoir été remplacé par InitCommonControlsEx(INTICOMMONCONTROLSEX * picce)

    Ps : j'ai mis à jour mon code dans le second message.

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 20
    Points : 47
    Points
    47
    Par défaut
    Effectivement, même soucis chez moi.

    J'ai repris le code du début et j'obtiens un résultat avec ce code-ci (non-nettoyé. Il peut y avoir des trucs inutiles qui traînent encore) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
     
    #include "stdafx.h"
    #include "WindowsProject3.h"
    #include <Windows.h>
    #include <CommCtrl.h>
     
    #define MAX_LOADSTRING	100
     
    #define BUTTON_ID		0x12
     
    // Global Variables:
    HINSTANCE hInst;                                // current instance
    WCHAR szTitle[MAX_LOADSTRING];                  // The title bar text
    WCHAR szWindowClass[MAX_LOADSTRING];            // the main window class name
     
    // Forward declarations of functions included in this code module:
    ATOM                MyRegisterClass(HINSTANCE hInstance);
    BOOL                InitInstance(HINSTANCE, int);
    LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
    INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);
    HWND CreateToolTip(int toolID, HWND hDlg, LPWSTR pszText);
     
    const wchar_t CLASS_NAME[] = L"Basic Window Class";
     
    #define Debug(x) MessageBox(NULL, (LPCWSTR)x, NULL, NULL);
     
     
    int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                         _In_opt_ HINSTANCE hPrevInstance,
                         _In_ LPWSTR    lpCmdLine,
                         _In_ int       nCmdShow)
    {
    	hInst = hInstance;
     
    	WNDCLASS wc = { };
    	wc.lpfnWndProc = WndProc;
    	wc.hInstance = hInst;
    	wc.lpszClassName = CLASS_NAME;
     
    	RegisterClass(&wc);
     
    	HWND hWnd = CreateWindow(
    		CLASS_NAME,
    		L"MainWindowClass",
    		WS_OVERLAPPEDWINDOW,
    		CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
    		(HWND)NULL,
    		(HMENU)NULL,
    		hInst,
    		NULL
    	);
    	if (!hWnd) { Debug(L"Error create MainWindow") }
     
     
    	ShowWindow(hWnd, SW_SHOW);
    	UpdateWindow(hWnd);
     
    	MSG msg;
     
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
     
        return (int) msg.wParam;
    }
     
     
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)
        {
    	case WM_CREATE:
    	{
    		CreateWindow(L"BUTTON", L"Push me !", WS_CHILD | WS_VISIBLE, 10, 10, 80, 60, hWnd, (HMENU)BUTTON_ID, NULL, NULL);
     
    		CreateToolTip(BUTTON_ID, hWnd, (LPWSTR)L"My balloon type tooltip");
    		break;
    	}
     
        case WM_COMMAND:
            {
                int wmId = LOWORD(wParam);
                // Parse the menu selections:
                switch (wmId)
                {
                case IDM_ABOUT:
                    DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
                    break;
                case IDM_EXIT:
                    DestroyWindow(hWnd);
                    break;
                default:
                    return DefWindowProc(hWnd, message, wParam, lParam);
                }
            }
            break;
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hWnd, &ps);
                // TODO: Add any drawing code that uses hdc here...
                EndPaint(hWnd, &ps);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hWnd, message, wParam, lParam);
        }
        return 0;
    }
     
     
    HWND CreateToolTip(int toolID, HWND hDlg, LPWSTR pszText)
    {
    	if (!toolID || !hDlg || !pszText)
    	{
    		return FALSE;
    	}
     
    	HWND hwndTool = GetDlgItem(hDlg, toolID);
     
    	HWND hwndTTip = CreateWindowEx(NULL, TOOLTIPS_CLASS, NULL,
    		WS_POPUP | TTS_ALWAYSTIP | TTS_BALLOON,
    		CW_USEDEFAULT, CW_USEDEFAULT,
    		CW_USEDEFAULT, CW_USEDEFAULT,
    		hDlg, NULL,
    		hInst, NULL);
     
    	if (!hwndTool || !hwndTTip)
    	{
    		return (HWND)NULL;
    	}
     
    	TOOLINFO toolInfo = { 0 };
    	toolInfo.cbSize = TTTOOLINFOA_V1_SIZE;
    	toolInfo.hwnd = hDlg;
    	toolInfo.uFlags = TTF_IDISHWND | TTF_SUBCLASS;
    	toolInfo.uId = (UINT_PTR)hwndTool;
    	toolInfo.lpszText = (LPWSTR)pszText;
     
    	SendMessage(hwndTTip, TTM_ACTIVATE, TRUE, 0);
     
    	if (!SendMessage(hwndTTip, TTM_ADDTOOL, 0, (LPARAM)&toolInfo)) 
    	{
    		Debug(L"SendMessage ADDTOOL error");
    	}
     
    	return hwndTTip;
    }

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Désolé pour ma réponse tardive. J'ai l'impression que j'avais tout simplement oublié d'activer le Tool Tip ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SendMessage(hwndToolTip, TTM_ACTIVATE, TRUE, NULL);
    Il ne me reste plus qu'à réfléchir comment accèder au Tool Tips d'une application externe, mais je pense que l'étape précédente était essentielle.

  7. #7
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 20
    Points : 47
    Points
    47
    Par défaut
    Il ne me reste plus qu'à réfléchir comment accèder au Tool Tips d'une application externe
    Comment ça ?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    En fait, je pilote une application externe à l'aide de l'API Windows. J'ai une série d'une vingtaine de boutons et je souhaiterais envoyer le message BM_CLICK sur le bouton ayant le tool tip identifié. Pour l'instant, je me suis basé sur le fait qu'il s'agisse du n-ième bouton, mais ce n'est pas assez précis, car j'ai l'impression que la numérotation change au cours du temps. Je n'ai pas non-plus envie de me baser sur les coordonnées du bouton...

  9. #9
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 20
    Points : 47
    Points
    47
    Par défaut
    Si c'est ta propre application, tu peux utiliser les ID des boutons pour les différencier ?
    Ceux-ci ne changent pas mais ne sont pas nécessairement unique si tel était le vouloir de celui qui les créent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    HWND MainWindow = FindWindow(CLASS_NAME, L"MainWindowClass");
     
    INT btExpect = BUTTON_ID;
     
    EnumChildWindows(MainWindow, EnumChildProc, (LPARAM)btExpect);
     
    BOOL CALLBACK EnumChildProc(
    	_In_ HWND   hwnd,
    	_In_ LPARAM lParam
    )
    {
    	BOOL ret = TRUE;
     
    	if (GetDlgCtrlID(hwnd) == (INT)lParam)
    	{
    		SendMessage(hwnd, BM_CLICK, NULL, NULL);
    		ret = FALSE;
    	}
     
    	return ret;
    }

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Non, c'est une application commerciale qui date de Mathusalem. J'entends par là, que rien n'a été fait pour que se soit un minimum convivial... J'ai aussi déjà investigué la piste des ID pour contrôler le menu, sans réel succès pour l'instant, mis à part de faire planter l'application elle-même. Je pense que c'est une bonne idée et que je dois creuser .

  11. #11
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2018
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 20
    Points : 47
    Points
    47
    Par défaut
    Si aucun ID n'a été défini, c'est chiant. Mais tu peux toujours passer par le texte du tooltip ou même celui du bouton... si tant est que tu prends en compte les différentes langues supportées par Mathusalem_App.

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    Oui, tout est dit, c'est chiant (surtout de rentrer les données à la main ). Je ne suis plus très sûr, mais il me semblait pouvoir bien accèder au tooltip en rusant quelque peu ; c'est-à-dire en déplacement le curseur de la souris par-dessus les boutons. Par contre, je n'ai pas trouvé comment remonter au bouton à partir du tooltip, du moins par une relation parent / enfant...

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Points : 30
    Points
    30
    Par défaut
    En tout cas, les 2 fonctions GetDlgCtrlID(hWnd:=hWndButton) et GetWindowLong(hWnd:=hWndButton, nIndex:=GWL_WNDPROC) me renvoient 0. Dois-je donc effectivement en déduire qu'il n'y a pas de ID associé ?

    Par contre, ce qui me dérange, c'est le champ .uId de TOOLINFO. Si je ne me trompe pas, sans passer par le GetDlgItem(hDlg:=hwndParent, nIDDlgItem:=nId) ou nId serait la valeur renvoyée (a priori non-nulle) par l'une des 2 précédentes fonctions, c'est peine perdue ? Pourtant, si je ne trompe pas, il n'y ait qu'un seul tooltip par contrôle, non ? Donc, quelle est réellement l'utilité de .uId ?

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le .uid de TOOLINFO n'est-t-il pas celui du contrôle auquel tu associes un tooltip (parmi les N que le contrôle tooltip peut gérer), plutôt que le controle tooltip lui-même?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 13
    Dernier message: 25/11/2016, 08h36
  2. Réponses: 2
    Dernier message: 23/05/2014, 13h48
  3. Acces aux données à partir des thread
    Par mastok007 dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 15/01/2014, 22h06
  4. Réponses: 2
    Dernier message: 13/08/2008, 17h46
  5. Réponses: 5
    Dernier message: 31/07/2006, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo