Onko mitenkään mahdollista tehdä jonkunlaista ohjelmaa, joka estäisi jonkun toisen ohjelman avaamisen. Haxhax..
Tutki loopissa onko ohjelman prosessi(CreateToolHelpSnapshot?) tai ikkuna(FindWindow) auki ja lopeta ohjelma?
Moikka Short Php!
Imports System
Imports System.Diagnostics
Imports System.Windows.Forms
Imports Microsoft.VisualBasic
'...
Sub MainFormLoad(sender As Object, e As EventArgs)
Timer1.Interval = 100
Timer1.Enabled = True
Timer1.Start
End Sub
Sub Timer1Tick(sender As Object, e As EventArgs)
Timer1.Stop
Dim prosessi As Process = _
System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim."
If Not prosessi Is Nothing Then
For i As Integer = LBound(prosessi) To UBound(prosessi)
Try
prosessi(i).Kill()
Catch ex As Exception
End try
Next
End if
prosessi = Nothing
Timer1.Start
End Sub
'...Dim prosessi As Process = _
System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim."Tuossa kohdassa jotain häikkää. Sanoo "Value of type '1-dimensional array of System.Diagnostics.Process' cannot be converted to 'System.Diagnostics.Process'"
Edit: Juu ite huomasin virheen
Dim prosessi As Process = _
System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim."
-->
Dim prosessi() As Process = _
System.Diagnostics.Process.GetProcessesByName("Excel") ' "Esim."Edit2: Notepadin kanssa yritin, mutta ei vaan kuole vaikka mitä yrittäisi :S
Moikka taas Short Php!
kokeile toimiiko tämä...(voit jättää 'Imports Microsoft.VisualBasic' pois)
'...
Dim prosessi() As Process = _
Process.GetProcessesByName("Notepad")
If Not prosessi Is Nothing Then
For i As Integer = 0 To _
prosessi.GetUpperBound(0)
Try
prosessi(i).Kill
Catch ex As Exception
End Try
Next
End If
'...Oon sattunut just vähän aihetta tutkimaan :) Tuollaisen toteuttaminen on hankalaa fiksusti ja resursseja säästävästi (jos sellasella on mitään merkitystä nykypäivinä). Dokumentoitu tapa seurata prosessien käynnistymistä on kutsua PsSetCreateProcessNotifyRoutine-APIa kernelissä, mutta se vaatii erillisen ajurin ja paljon työtä. Usermodessa vois jonkun system-wide hookin asennella ja seurata vaikka CreateProcess-kutsuja (vaikka prosessin kyllä voi luoda kutsumatta tätä APIa), tosin jokaisen prosessin muokkaaminen on purkkaa, vaarallista ja ei myöskään niin kevyt ratkaisu.
Mutta sittenpä keksin ehkä parhaan ratkaisun, jota ei kukaan oo välttämättä vielä toteuttanut (eli onkohan edes mahdollinen :D). Kun prosessi luodaan, niin otetaan yhteyttä csrss.exe-prosessiin CsrClientCallServer-APIa käyttämällä. csrss:ltä pyydetään prosessille hProcess, hThread, TID, PID ja muuta sälää, eli sitä on pakko kutsua kun prosessia luodaan. Meidän tarvitsee vain tutkia missä päin csrss.exeä käsitellään uuden prosessin luonti, ja hookkaammalla sieltä jokin sopiva kohta tai funktio (esimerkiksi vastauksen lähettäminen takas prosessia luovalle prosessille), niin pystymme seuraamaan jokaisen prosessin luontia. Näin päästään käsiksi tärkeisiin kahvoihin ja tunnuksiin ennen kuin edes prosessia luova prosessi vastaanottaa ne. Helposti GetModuleFileNameEx:llä (tai suoraan ZwQueryInformationProcess:lla) saadaan kahvasta tiedostopolku, jolloin voidaan vaikka tappaa tietyn nimisten .exe-tiedostojen prosessit.
Nojoo, ehkä turhan teknistä ja hankalaa toteuttaa varsinkin VB.NETillä. Etkö voisi vain uudelleennimetä tai poistaa sitä ohjelmaa? Tai sitten vaan käytät sitä timeriä tai looppia...
Kun ohjelmasi käynnistyy, muokkaa sen toisen ohjelman ensimmäiset käskyt niin että se lopettaa heti (laita vaikka ensimmäisiksi tavuiksi B4 4C CD 21), ja ohjelmasi sulkeutuessa muokkaat ne takaisin. Siltä varalta, että ohjelmasi pakotetaan sulkeutumaan, tallennat edelliset käskyt tiedostoon josta luet ne ohjelman sulkeutuessa, ja tallennat tiedostoon alussa vain jos ohjelman ensimmäiset käskyt eivät ole jo valmiiksi B4 4C CD 21.
Heippa taas!
siis onko tässä nyt vielä jotain epäselvää..?
' (väännetty SharpDevelop 3.0:lla)
' käännä, pistä .exe pyörimään,
' avaa Tehtävienhallinta ja tutki suoritinkäyttöä...
Imports System
Imports System.Diagnostics
Imports System.Windows.Forms
Public Partial Class MainForm: Inherits Form
Public Sub New()
Me.InitializeComponent()
End Sub
Sub MainFormLoad(sender As Object, e As EventArgs)
Timer1.Interval = 25
Timer1.Enabled = True
Timer1.Start
End Sub
Sub Timer1Tick(sender As Object, e As EventArgs)
Timer1.Stop
Dim prosessi() As Process = _
Process.GetProcessesByName("Notepad")
If Not prosessi Is Nothing Then
For i As Integer = 0 To _
prosessi.GetUpperBound(0)
Try
prosessi(i).Kill
Catch ex As Exception
End Try
Next
End If
prosessi = Nothing
Timer1.Start
End Sub
Sub MainFormFormClosed( _
sender As Object, e As FormClosedEventArgs)
End
End Sub
Sub MainFormFormClosing( _
sender As Object, e As FormClosingEventArgs)
Me.Dispose
End Sub
End ClassAihe on jo aika vanha, joten et voi enää vastata siihen.