[.NET 2] APi : Recupérer titre de la fenetre active

fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008 - 7 avril 2007 à 12:26
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008 - 8 avril 2007 à 10:29
Bonjour,

Je voudrais récupérer le titre de la fentre windows active mais j'ai une erreur :

  Private Declare Function GetForegroundWindow Lib "user32" () As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByRef hwnd As Long, ByRef lpString As String, ByRef cch As Long) As Long

  Dim a As Long = GetForegroundWindow
        Dim Titre As String = ""
        Dim L As Long = GetWindowText(a, Titre, 256) 'L retourne la longueur de la chaîne,Titre retourne le titre de la fenêtre.

Mais dans la variable "Titre", y'a un string en chinois !

De plus, j'ai modifier la déclaration de l'API avec des Byref au lieu des Byval car sinon j'ai :
Un appel à la fonction PInvoke 'Copy Files!Copy_Files.Form1::GetWindowText' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.

Quel est le problème ? Merci

14 réponses

fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
7 avril 2007 à 14:36
en fait problème résolu il faut modifier tous les Long en Integer !

Sinon autre problème :

Commen récupérer le chemin de la fenetre qui as le focus ? (exemple : C:\program files\MonProg)

Merci
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
7 avril 2007 à 17:08
Il me semble qu'en DotNet la fonction d'API GetActiveWindow est remplacé par



System.Windows.Forms.Form.ActiveForm


Pour le Path de l'appli de la fenêtre, c'est GetWindowsDirectory :

Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

@++





<hr width="100%" size="2" />

  --Mortalino--
Le mystérieux chevalier, ~Provençal, le Gaulois~
  
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
7 avril 2007 à 17:47
Non c'est pas GetWindowsDirectory car ca c'est pour récupérer le path de la fenetre qui s'execute en ce moment (donc mon programme) or moi je veux le path de la fenetre qui à le focus ! donc en fonction de son Handle.... et je trouve toujours pas le bon API ...
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 avril 2007 à 19:13
GetWindowThreadProcessId
OpenProcess
GetModuleFileName
CloseHandle

ciao...
BruNews, MVP VC++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
7 avril 2007 à 19:35
Salut,

J'ai rien compris à ce que tu as dit !
De plus j'ai deja essayer cette methode mais je crois que l'API GetWindowThreadProcessId plante en VB.NET 2005

Pourais tu me donner un exemple en VB pour que je teste ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 avril 2007 à 19:52
Tu prends chaque nom de fonction et tu fais une recherche dessus.
Je ne ssuis pas frameworkien, je me borne à lister les APIs nécessaires.

ciao...
BruNews, MVP VC++
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
7 avril 2007 à 20:31
bon ba ca va pas m'aider car comme je te l'ai dis j'ai deja essayer ta technique mais y'a un problème sur GetWindowThreadProcessId

Aidez moi please !!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 avril 2007 à 20:59
1er param est ByVal, l'autre c'est un pointeur donc ByRef pour que la fonction puisse y écrire la valeur.

ciao...
BruNews, MVP VC++
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
7 avril 2007 à 21:08
ok merci ca marche now je voudrais savoir pour cette API GetModuleFileNameEx qu'est ce que je dois mettre en Byval et en ByRef... De plus, pourrais tu m'expliquer la différence ?
Merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 avril 2007 à 21:22
ByVal on passe la valeur, ByRef on passe l'adresse. Sera donc ByRef quand la fonction DLL attend un pointeur.
GetModuleFileName suffisant, pas besoin de la version Ex.
Mets GetModuleFileName dans la zone de recherche plus haut et tu trouveras des exemples.

ciao...
BruNews, MVP VC++
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
7 avril 2007 à 23:49
Salut,
J'ai un problème GetModuleFileName retourne 0 et j'ai rien dans le string....

Code :

'Déclaration :
 Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Integer, ByRef lpdwProcessId As Integer) As Integer

    Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer

    Const PROCESS_QUERY_INFORMATION As Integer = &H400
    Const PROCESS_VM_READ As Integer = &H10
    Const PROCESS_ALL_ACCESS As Integer = &H1F0FFF

    Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Integer, ByVal lpFileName As String, ByVal nSize As Integer) As Integer

 Dim a As Integer = GetForegroundWindow 'récupère le handle de la fenetre
        Dim result As New Integer
        GetWindowThreadProcessId(a, result) 'récupère dans "result" l'ID du process
        Dim hprocess As Integer = OpenProcess(PROCESS_ALL_ACCESS, CInt(False), result) 'ouvre le process
        Dim XXX As String
        XXX = Space(200)
        GetModuleFileName(hprocess, XXX, 1024) 'récupère le chemin de la fenetre
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 avril 2007 à 09:27
Si tu es en VB6, commence par bannir 'Integer', c'est un entier 16 bits qui ne s'emploie plus depuis 1995, mettre 'As Long' PARTOUT.

Dim szfile As String
szfile = Space(256)
GetModuleFileName(hprocess, szfile, 256)
CloseHandle hprocess

ciao...
BruNews, MVP VC++
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 avril 2007 à 10:10
OUPS, c'est bien GetModuleFileNameEx qu'il faut empployer.

ciao...
BruNews, MVP VC++
0
fdiedler2000 Messages postés 383 Date d'inscription samedi 29 janvier 2005 Statut Membre Dernière intervention 1 décembre 2008
8 avril 2007 à 10:29
Re,

Je suis en VB.NET donc c'est bien des Integer (je m'etais deja fait avoir ^^)
SInon idem ca amrche pas avec GetModuleFileNameEx mais j'ai une erreur cette fois :

  Exception runtime levée : System.EntryPointNotFoundException - Impossible de trouver le point d'entrée 'GetModuleFileNameEx' dans la DLL 'PSAPI.DLL'.   

Code :

Dim XXX As String
        XXX = Space(200)
        GetModuleFileNameEx(hprocess, 0, XXX, 1024) 'récupère le chemin de la fenetre

Si j'inverse le 0 et le hprocess, c'est pareil j'ai une erreur... De plus, hprocess n'est pas nul...
0
Rejoignez-nous