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

Visual C++ Discussion :

SetWindowLong et ConsoleWindowClass


Sujet :

Visual C++

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Par défaut SetWindowLong et ConsoleWindowClass
    Bonjour,

    Une tite question concernant la fonction SetWindowLong( ) et une fenetre console. Bon ok, l'interet est assez limité (quoique) mais je voudrais juste comprendre POURQUOI ????
    Je peux récupérer un Handle de fenetre sur une fenetre console (avec GetConsoleWindow() dans kernel32.dll), ensuite faire un moveWindow() ou getWindowLong(), tout se passe bien. Mais impossible d'utiliser la fonction SetWindowLong() avec ce Handle. Apres appel de SetWindowLong je recupère une erreur "invalid Index" (1423) via GetLastError().

    Auriez-vous une idee du pourquoi du comment que ca veut pas fonctionner le schmillblick ???

    ++
    Fred

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Quel index utilises-tu, déjà ?
    GWL_USERDATA ?


    Et aussi: Es-tu sûr que la fenêtre console appartient bien à ce process-là ?
    (si tu lances le programme depuis l'invite de commandes par exemple, c'est pas sûr...)
    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.

  3. #3
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Par défaut
    J'utilise l'index GWL_STYLE.

    Et aussi: Es-tu sûr que la fenêtre console appartient bien à ce process-là ?
    Peux-tu préciser ta question stp ?? Je ne suis pas sur de bien comprendre ou tu veux en venir ??

    Pour plus de détails :
    Ma fenetre est créée par un allocConsole, je recupere sans soucis les differents handle de buffer et de fenetre et les utilise ensuite sans pb !! Sauf avec SetwindowLong ... J'ai meme pu afficher un bouton dans ma fenetre Dos !! Ca merite un IgnoBel !!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bon, si ta console est créée par AllocConsole() (oui, sous Win32, toutes les fonctions commencent par une majuscule), tu peux oublier ma question précédente. Hélas, pour SetWindowLong(), je ne peux pas trop t'aider...

    Au fait: D'après MSDN, l'erreur 1423 est ERROR_WINDOW_NOT_COMBOBOX. Es-tu sûr d'avoir fait un SetLastError(0) avant ton SetWindowLong() ?
    Edit: Ah, ERROR_INVALID_INDEX a la valeur 1413. Ce devait être une faute de frappe...

    As-tu essayé d'autres indexes ?
    Edit: Tiens, la question bête: Tu ne te goures pas entre l'index et le LONG ?
    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.

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Par défaut
    Effectivement, c'est 1413 que me renvoit GetLastError().

    Oui j'ai testé d'autres index, meme resultat !!

    Voila comment j'essaie de modifier la fenetre :

    SetWindowLong(consoleWindow, GWL_STYLE, GetWindowLong (consoleWindow, GWL_STYLE) & !WS_OVERLAPPED);

    Est-ce que ca te parait correct dans la maniere de faire ??

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour commencer, je te conseillerais de procéder par étapes (ne pas tout mettre dans la même ligne). Et vérifier GetLastError() entre le get et le set.
    Essaie également en remettant le même style sans le modifier. Il est possible que le style obtenu par cette simple manip soit invalide...
    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.

  7. #7
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Par défaut
    J'ai deja testé étape par étape, le résultat est le même.
    Il doit y avoir une question de sécurité ... Le Get fonctionne bien et me renvoit une valeur (l'index existe donc ?!?), alors que le set me renvoit une erreur d'index via GetLastError.

  8. #8
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    tout simplement parce qu'une boîte de commande MSDOS n'est pas vraiment une fenêtre windows au sens windows...,
    j'ai été confronté il y a quelques années à ce probleme en voulant enlever la croix de la fenêtre pour empecher les fermetures intempestives de l'utilisateur.
    hé bien ce n'est pas possible pour la raison évoquée .

  9. #9
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 51
    Par défaut
    Farscape, as-tu plus d'informations sur la boite de commande Windows ??

    GetWindowLong nous renvoit bien des infos concernant cette fenetre.
    Il y a bien une fenetre windows (le tour) puis des buffers a l'interieur.
    Il est possible de récupérer un handle (HWND) sur la fenetre, de lire les informations de style associées, de bouger/redimensionner cette fenetre, d'y ajouter des éléments (bouton, edit, ....) et pourtant on ne pourrait pas en modifier le style ?!?
    Ca ressemble quand meme beaucoup a de la fenetre Windows.

    Les informations de style et autres ne seraient elles pas chargées dans une zone mémoire non accessible en écriture ??

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Bizarre, moi sous WinXP j'ai l'erreur 5 : ERROR_ACCESS_DENIED...

    Code C : 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
    #define WIN32_LEAN_AND_MEAN
    #define _WIN32_WINNT 0x501
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
     
    void writeCon(LPCTSTR scz)
    {
    DWORD cchEcrits = 0;
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), scz, lstrlen(scz), &cchEcrits, NULL);
    }
     
    int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR szCmd, int nShow)
    {
    	DWORD err;
    	HWND hWnd;
    	TCHAR szBuf[80];
    	(void)hInst;
    	(void)hPrev;
    	(void)szCmd;
    	(void)nShow;
     
    	//Création console et récupération fenêtre
    	AllocConsole();
    	writeCon(TEXT("Test\n"));
     
    	hWnd = GetConsoleWindow();
    	_sntprintf_s(szBuf, 80, _TRUNCATE, TEXT("Fenêtre : hWnd = %p\n"), hWnd);
    	writeCon(szBuf);
     
    	//Tests de style
    		{
    		DWORD style;
    		DWORD style2;
    		DWORD style3;
    		//Lecture du style
    		style = GetWindowLong(hWnd, GWL_STYLE);
    		_sntprintf_s(szBuf, 80, _TRUNCATE, TEXT("style = %08lX\n"), style);
    		writeCon(szBuf);
     
    		//Ecriture du style
    		SetLastError(0);
    		style2 = SetWindowLong(hWnd, GWL_STYLE, style);
    		err = GetLastError();
    		style3 = GetWindowLong(hWnd, GWL_STYLE);
    		_sntprintf_s(szBuf, 80, _TRUNCATE,
    		 TEXT("style2 = %08lX - style3 = %08lX - err = %lu\n"), style2, style3, err
    		 );
    		writeCon(szBuf);
    		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, szBuf, 80, NULL);
    		szBuf[80-1] = TEXT('\0');
    		writeCon(szBuf);
    		}
     
    	MessageBox(NULL, TEXT("Test"), TEXT("Test"), MB_OK);
    	FreeConsole();
    	return 0;
    }
    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.

  11. #11
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    La fenêtre console ne t'appartient pas, elle est créé côté noyau par csrss qui contrôle et partage le nombre de fenêtres consoles entre tous les process de la session. C'est lui qui contient la boucle des messages, et tout et tout. C'est pour ça aussi que la fenêtre n'a pas le theme XP (côté noyau), et qu'un bug dans le code de la console provoquait un écran bleu il y a quelques temps encore.
    Pour griser le bouton fermer, il me semble que c'est possible:
    http://support.microsoft.com/kb/818361/en-us

Discussions similaires

  1. [C#] Crash SetWindowLong
    Par JulienDuSud dans le forum Windows
    Réponses: 13
    Dernier message: 09/10/2008, 22h31
  2. Réponses: 8
    Dernier message: 07/12/2005, 14h44

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