Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008
-
9 mars 2007 à 07:08
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 2011
-
12 mars 2007 à 20:09
Bonjour à tous.
Est il possible d'executer un programme non vb 2005 avec un appli vb 2005 et avec l'option "Topmost" ?
Pour lancer des prog j'utilise:
Imports System.IO
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim chemin As String = "setup.exe"
Dim process As New Process
For Each disque As String In Directory.GetLogicalDrives()
Dim D As New DriveInfo(disque)
If D.DriveType = DriveType.CDRom Then
Try
If My.Computer.FileSystem.FileExists(disque + chemin) = True Then
process.StartInfo.FileName = disque + chemin
process.Start()
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End If
Next
End Sub
End Class
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 9 mars 2007 à 13:12
Ok mais ce n'est pas ce que je veus:
Avec ma form, j'ouvre un programme du genre Wmplayer ou IE, et je voudrais que ce programme s'ouvre au premier plan et y reste !(l'equivalent du topmost pour vb 2005)
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 9 mars 2007 à 15:03
Salut,
Il n'est malheureusement pas possible de laisser IE par exemple en pleine écran mais il y a toujours un moyen de contourner le système pour arriver à tes fins.
Ce que tu peux faire c'est empêcher que Internet Explorer se lance et de créer toi même une form pour remplacer IE (petit indice : il faut utiliser le control WebBrowser qui permet d'afficher des pages web comme sur IE). Et là, la form tu peux lui mettre sa propriété TopMost à True.
Pour empêcher Internet Explorer de se lancer, Ajouter un Timer, règle le pour un intervalle 100 ms et mets le code qui suit dans la procédure Timer_Tick :
Dim prc As System.Diagnostics.Process() = Process.GetProcesses() ' Liste tous les processus
For i As Integer = 0 To prc.Length - 1 ' Parcoure tous les processus trouvés
If prc(i).ProcessName = "iexplore" Then ' Si un processus s'appelle "iexplore" (Internet Explorer)
prc(i).Kill() ' On tue le processus
End If
Next, ----
ad vitam aeternam
Messages postés17Date d'inscriptionjeudi 19 mai 2005StatutMembreDernière intervention10 mars 2008 9 mars 2007 à 17:18
Moi j'avais compris autre chose; tu voudrais (si je comprends donc bien) que internet explorer ce lance depuis ta form.
En vb6 par exemple tu lancerais internet explorer avec un shell puis tu utiliserais l'API SetWindowsPos
Tu déclare ta fonction puis dans ton programme après le shell tu mets:
SetWindowPos(iexplore.hwnd,HWND_TOPMOST, x,y,cx,cy, 0)
iexplore représente ici le programme internet explorer dont tu doit connaître le handle (hwnd), x y cx cy sont les diverses caractéristiques de positions données si dessous en annexe.
Mais alors, le plus grose problème reste de trouver le handle d'internet explorer: pas de problème avec l'API GetWindowThreadProcessId tu déclares:
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Puis tu utilises la fonction
explorer_thread=GetWindowThreadProcessId(iexplorer, test_pid)
qui te retournera dans explorer_thread le thread de internet explorer.
Désolé si j'ai mal compris ce que tu demandais!
ad vitam aeternam
annexe:
Fonction SetWindowPos
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" ( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long)As Long
Versions : . Windows 95/98 : Oui . Windows NT : A partir de 3.1 . Windows 2000/XP : Oui
Description :
Cette API permet d'afficher la fenêtre où bon vous semble sur
l'écran en exécutant une méthode du type move avec la possibilité de laisser la feuille toujours au premier plan d'affichage.
hwnd est le handle de la feuille,
hWndInsertAfter est une des contantes définies ci-dessous,
X, Y, cx et cy sont respectivement les coordonnées et les dimensions de l'image.
wFlags est une combinaison de constantes ci-dessous.
<center>
Constante,
Valeur,
Définition,
----
HWND_BOTTOM,
1,
Place la fenêtre en dessous de toutes les autres.,
----
HWND_NOTOPMOST,
-2,
Place la fenêtre au dessus de toutes les fenêtres qui n'ont pas l'attribut "TOPMOST" (et en dessous de ces dernières).,
----
HWND_TOP,
0,
Place la fenêtre au premier niveau.,
----
HWND_TOPMOST,
-1,
Place la fenêtre au premier niveau, celle-ci conserve cet attribut même lorsqu'elle perd le focus.,
----
SWP_HIDEWINDOW,
&H80,
Cache la fenêtre.,
----
SWP_NOACTIVATE,
&H10,
N'active pas la fenêtre.,
----
SWP_NOMOVE,
&H2,
Garde la même position (les paramètres X et Y ne sont pas pris en compte).,
----
SWP_NOSIZE,
&H1,
Conserve les dimensions courantes (paramètres cx et cy pas pris en compte).,
----
SWP_SHOWWINDOW,
&H40,
Affiche la fenêtre.
</center>
Vous n’avez pas trouvé la réponse que vous recherchez ?
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 9 mars 2007 à 17:53
En fait ce n'est pas ça du tout. Excusez moi pour ma maladresse en explication. Je ne veut pas d'internet, mais c'était juste un exemple de logiciel, comme windows media player ! Le prog que je veu mettre au premier plan n'est pas programé en vb et doit etre lancé à partir de ma form. Mais, je croyais que l'on pouvait lancer des applications depuis une form avec des conditions comme l'affichage en plein ecran !
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 9 mars 2007 à 18:08
Salut,
Est ce que tu peux me dire quel est le nom du processus de ton programme ? Pour le savoir, faire [CTRL]+[ALT]+[Suppr]
puis vas dans l'onglet processus. J'ai peut être trouvé quelue chose ?
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 9 mars 2007 à 18:12
C'est la visionneuse dont je t'ai deja parlé. Cependant, grace à la fonction FileSystemWatcher, je ne pense plus avoir besoin de cette fonction. Au lieu d'interdire l'utilisateur en bloquant ses fenetres, j'ejecterais le cd en verifiant la date d'acces au dossiers du cd !
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 9 mars 2007 à 18:49
Ok !
Mais faut savoir que même si un programme accède à ton dossier il modifie la date d'accès par exemple : il suffit de lit un fichier dans le dossier la date d'accès sera modifié et le CD va se faire éjecter. Je sais pas si c'est une bonne solution.
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 11 mars 2007 à 20:46
Ah ouais j'y avait pas pensé ! Merci bien.
Je vais voir ce que je peux faire. Plutot surveiller si le dossier n'est pas copié alors si je comprends bien ?
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 12 mars 2007 à 00:12
Bon, j'ai fait un petit programme pour toi. j'ai reussi à détecter la copie d'un dossier ou fichier et d'éjecter le CD mais en revanche ca ne fonctionne que si le dossier à protéger est sur le disque dur car nircmd n'éjecte pas le cd s'il est en cours d'utilisation (la copie).
Donc ca ne fonctionne pas.
En revanche, j'ai reussi à trouver un moyen d'empêcher que l'utilisateur se promène sur ton CD. En effet, grâce à nircmd je peux fermer toutes les fenêtres d'explorations (Poste de travail, Ma musique, Mes documents, ...)
Tu pourras essayer si tu arrives à accéder à ton CD pendant l'exécution de mon programme alors Bravo mais il faudra que tu me dise comment tu as fait
Marneus73
Messages postés344Date d'inscriptionmercredi 24 janvier 2007StatutMembreDernière intervention27 octobre 2008 12 mars 2007 à 07:17
Salut.
Merci bien. J'ai testé et c 'est vraiment bien. Juste, tu a oublié de mettre les deux nircmd dans le dossier ressources (je les ai rajoutés) !
J'ai aussi un autre probleme: J'ai essayé de comprendre ton code, et je ne vois pas comment tu fais pour ejecter le cd !!! De plus, quand le prog est lancé, je vais dans le post de travail. La fenetre se ferme automatiquement, mais il n'y a pas d'ejection de CD ! Cependant nircmd est bien sur le DD de windows, j'ai vérifié !
A oui aussi si avant de lancer ton prog, on crée un raccourci vers le lecteur CD, et le prog ne le voit pas et on peut se balader sur le CD !
Est-ce que c'est ça qui ferme le poste de travail ???
Shell("C:\nircmd.exe win close class ""CabinetWClass""")
Merci
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 12 mars 2007 à 14:41
Salut,
Voici le programme pour éjecter le cd si une copie est détectée dans le dossier à surveiller :
1) Il faut que chemin d'accès du dossier soit dans la TextBox (au lieu de le taper à la main j'ai rajouté un FolderBrowserDialog pour choisir un dossier) Plus pratique !!!
2) Je n'ai pas encore compris pourquoi mais le CD n'est pas éjecter si tu choisis un dossier à surveiller sur celui-ci
mais il éjecte bien le CD si le dossier à surveiller est sur le disque dur
L'autre programme pour verrouiller l'accès au disque, il n'y avait pas
nircmd car quand on met un une source sur vbfrance, il enlève tous les
.exe donc nircmd est passé à la trappe.
cs_fauve
Messages postés661Date d'inscriptionvendredi 2 décembre 2005StatutMembreDernière intervention23 mars 20118 12 mars 2007 à 20:09
Oui c'est faisable, tu mets Shell("C:\nircmd.exe win close class ""CabinetWClass""") mais en revanche il faut l'exécuter régulièrement grâce à un timer mais le souci c'est que là ton programme monopolise beaucoups de ressources. Ou alors, il faudrait détecter qu'une fenêtre de l'explorateur Windows a été ouverte et tu lances la commande Shell ci-dessus. Crée un nouveau topic pour savoir s'il possible de détecter l'ouverture de l'explorateur Windows en vb.net (Tu peux mettre le sujet en bleu pour le topic).