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

Dotnet Discussion :

Définir le "Window Name" et le "Class Name" d'une form


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut Définir le "Window Name" et le "Class Name" d'une form
    Bonjour à tous,

    Devant m'atteler à la conception d'un soft sur demande spécifique, j'ai pour contrainte de définir le "Window Name" et la "Class Name" d'une form.

    En effet, cette form doit recevoir des messages d'une autre application qui utilise la méthode FindWindow.

    Après diverses recherches sur le net, je ne trouve rien qui puisse m'aiguiller.

    Quelqu'un a t'il une solution ou des pistes concernant ce problème?

    Merci d'avance

    PS : Je précise qu'il me faut une solution en C# ou VB

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    pour définir le class name et le windows name il faut le faire avant meme que la form ne soit créée...

    en effet cela se fait au moment des appels à l'api windows qui va créer effectivement le controle... ce que dotnet fait pour toi puisqu'il fourni la classe (bridge natif/managé) et la fenêtre à créer...

    RegisterClass
    CreateWindow

    sont les 2 méthodes natives concernées.
    Problème, même si tu peux éventuellement changer le windowname, la classe cela risque d'être difficile, en effet, les appels API sont effectués au moment où tu instancie la form.
    on ne peut donc à priori pas changer la classe registered...

    il va peut etre falloir que tu oublie les winforms et te fasse tes propres wrappers...
    ou alors tu va devoir envisager une solution hybride en C++/CLI.

    Ne serait-il pas plus simple d'employer un mode de communication interprocessus plus "conventionnel" comme les NamedPipe ou les Sockets?

  3. #3
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut
    Merci pour ta réponse.

    Si ça n'avait tenu qu'à moi, j'aurai effectivement pensé à des moyens de communication beaucoup plus simples.
    Malheureusement, je me trouve face à la "solution" d'un éditeur tiers, et je ne peux donc pas faire autrement que d'utiliser leur protocole. A moins que je ne réussisse à les faire changer d'avis (et ça, c'est pas gagné).

    Sinon, en effet, il me reste la solution de créer une appli en C++ qui recevrait les messages, et serait chargée de les retransmettre via un protocole définit.
    Mais vu que je ne connais strictement rien au C++, ça me paraît compromis.

  4. #4
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    j'ai pour contrainte de définir le "Window Name" et la "Class Name" d'une form.
    Peut-être (à essayer quand même) :
    • "Window name" pourrait être redéfini via la propriété Text de la forme,
    • "Class Name" serait défini par la propriété Name de la forme.

  5. #5
    Membre très actif Avatar de joKED
    Profil pro
    Imposteur en chef
    Inscrit en
    Février 2006
    Messages
    339
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Imposteur en chef

    Informations forums :
    Inscription : Février 2006
    Messages : 339
    Par défaut
    Parfois, les choses sont aussi simples qu'elles le semblent, enfin, en partie

    Donc, pour le window name, il suffit en effet de définir la propriété Text de la form. Merci Graffito.

    Concernant le class name, le fournisseur de mon appli tierce m'a fourni du code, qui a le mérite de fonctionner, qui me paraît relativement obscur (car peu commenté il faut avouer), mais que j'ai pu adapter pour faire fonctionner mon appli, sans pour autant comprendre son fonctionnement dans le détail, ce qui m'ennuie fortement, mais peut être pourrez vous m'aider.

    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
      ' WM_APP is 0x8000
        Const WM_APP = (&H8000)
        Const WM_ALLREADY = (WM_APP + &H1)
        Const WM_KEY = (WM_APP + &H5)
        Const WM_AC_STATUS = (WM_APP + &H8)
        Const WM_SD_STATUS = (WM_APP + &H9)
        Const WM_BRIGHTNESS = (WM_APP + &H103)
     
        ' Declare functions for PostMessage
        Declare Function FindWindow Lib "Coredll" Alias "FindWindowW" _
            (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
        Declare Function PostMessage Lib "Coredll" Alias "PostMessageW" _
            (ByVal hWnd As Integer, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
     
        ' Variables
        Dim hMain As Long
        Dim hWnd As Long
        Dim flag As Boolean
        Dim str As String
     
        ' VB.NET request delegate to use "AddressOf" operator
        ' refer http://msdn.microsoft.com/en-us/library/kkasf56d(vs.71).aspx 
        Public Delegate Function WinProcDelegate(ByVal hwnd As Integer, ByVal msg As Integer, _
            ByVal wParam As Integer, ByVal lParam As Integer) As Integer
     
        ' Declare funcstions for receive messages
        Public Declare Function SetWindowLong Lib "Coredll" Alias "SetWindowLongW" _
            (ByVal hwnd As Integer, ByVal nIndex As Integer, ByVal dwNewLong As WinProcDelegate) As Integer
        Public Declare Function CallWindowProc Lib "Coredll" _
            (ByVal lpPrevWndFunc As Integer, ByVal hwnd As Integer, ByVal msg As Integer, _
            ByVal wParam As Integer, ByVal lParam As Integer) As Integer
     
        ' Variables
        Const GWL_WNDPROC = (-4)
        Dim PrevProc As Integer
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            Dim addr As String
            Dim addr2 As String
     
            flag = True
     
            ' Get App.exe and Main.exe handle
            hWnd = FindWindow(vbNullString, "App")
            hMain = FindWindow("Main", vbNullString)
            'hMain = FindWindow(vbNullString, "MsgTest") ' Test purpose
     
            ' Show handle to check
            addr = Hex(hWnd)
            addr2 = Hex(hMain)
            txtBox.Text = "App:" & addr & " Main:" & addr2
     
            ' Subclassing
            PrevProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WinProc)
        End Sub
     
        Private Sub bSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bSend.Click
            Try
                'PostMessage sample function
                If flag = True Then
                    PostMessage(hMain, WM_BRIGHTNESS, 9, 0)
                    txtBox.Text = "WM_BRIGHTNESS : 9"
                    flag = False
                Else
                    PostMessage(hMain, WM_BRIGHTNESS, 0, 0)
                    txtBox.Text = "WM_BRIGHTNESS : 0"
                    flag = True
                End If
            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        End Sub
     
        Public Function WinProc(ByVal hwnd As Integer, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
            ' Message receive sample
            Select Case msg
                Case WM_ALLREADY
                    txtBox.Text = "WM_ALLREADY"
                Case WM_KEY
                    txtBox.Text = "WM_KEY"
                Case WM_AC_STATUS
                    txtBox.Text = "WM_AC_STATUS " & wParam & ", " & lParam
                Case WM_SD_STATUS
                    txtBox.Text = "WM_SD_STATUS " & wParam
            End Select
            WinProc = CallWindowProc(PrevProc, hwnd, msg, wParam, lParam)
        End Function
    En gros, il permet d'obtenir les messages remontés par une appli nommée Main.exe dans mon appli courante nommée App.exe . Main.exe monitore les états (état batterie, branchement de l'usb, etc..) d'un matériel executant WinCE 6.0 , et notifie l'appli App.exe de ces changements d'état. On peut aussi, depuis App.exe, envoyer des commandes à Main.exe pour définir certaines valeurs (dans l'exemple, le niveau de luminosité de l'écran).

    De ce que j'en ai compris :
    - Lors du chargement de la form, on exécute un Findwindow pour obtenir le handle de la fenêtre de mon appli courante (App.exe) et de l'appli Main.exe . Seul celui du main nous sera utile ensuite, celui de l'app courante n'est utilisé qu'à titre d'information.
    - Ensuite, vient une ligne de code (commentée "Subclassing" ???) dont je ne comprends pas le fonctionnement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' Subclassing
            PrevProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WinProc)
    Mis à part le fait qu'on lui passe un pointeur vers une fonction qui s'occupe de traiter la réception de message.
    Enfin, dans la fonction qui s'occupe de la réception du message (fonction WinProc), on traite le message reçu, jusqu'ici je comprends, mais vient une dernière ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WinProc = CallWindowProc(PrevProc, hwnd, msg, wParam, lParam)
    que je ne comprends absolument pas. Je n'ai pas la moindre idée de ce qu'elle peut faire.

    En gros, si quelqu'un comprend quelque chose à cet imbroglio, (et qu'il a le courage de m'expliquer), je lui en serait reconnaissant.

  6. #6
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Le "subclassing" permet d'intercepter les messages Windows : http://megaten.alterlinks.fr/vbtools...ubClassing.php
    l'instruction "PrevProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WinProc) " récupère la procedure traitant les messages avant le subclassing.

    La procedure "Public Function WinProc(... ' Message receive sample" intercepte tous les messages Windows après le SubClassing , en affiche certains dans la TextBox, puis appelle simplement le traitement standard d'avant le SubClassing.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/12/2010, 14h55
  2. fenetre modale + définir taille de windows
    Par mariox dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 07/03/2010, 17h36
  3. [JNDI] javax.naming.NoInitialContextException: Need to specify class name
    Par j-mi-jim dans le forum Java EE
    Réponses: 1
    Dernier message: 30/01/2008, 10h34

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