Zugriff auf Controls in einem Window von einer anderen Applikation

10/07/2009 - 10:36 von Hermann Durchleuchter | Report spam
Hallo.
für den Zugriff auf Controls in einem Window von einer anderen Applikation
habe ich nachfolgenden Code als Beispiel verwendet, der leider eine Exception
ausgibt oder kein Result liefert.
Hat jemand einen Tip woran das liegen kann bzw. einen anderen Lösungsansatz?

Danke!

string _filefullName = @"C:\WINDOWS\Explorer.EXE";
string window_title = "Arbeitsplatz";
try
{
//Assembly currentAssembly = Assembly.LoadFile(_fileName);
Assembly currentAssembly = Assembly.LoadFrom(_filefullName);
Type formType = currentAssembly.GetType(window_title);
if (formType != null)
{
Form testForm =
(Form)currentAssembly.CreateInstance(formType.FullName);
//Form testForm = (Form)Activator.CreateInstance(formType.FullName);
if (testForm != null)
{
foreach (Control control in testForm.Controls)
{
MessageBox.Show("Control Name:" + control.Name);
}
}
}
}
catch (Exception se)
{
MessageBox.Show(" Error :" + se.Message);
}
 

Lesen sie die antworten

#1 Udo Schneider
10/07/2009 - 20:28 | Warnen spam
Hi.

Hab mal Deinen Code ausprobiert, damit ich sehe, was denn da für ne
Exception kommt:

Error: Die Datei oder Assembly "file:///C:\WINDOWS\Explorer.EXE" oder
eine Abhàngigkeit davon wurde nicht gefunden. Im Modul wurde ein
Assemblymanifest erwartet."

Bin jetzt zwar absolut kein Crack in Sachen Interprozesskommunikation,
aber ich würd mal sagen, mit "Explorer.exe" kann Dein Programm so nicht
kommunizieren weil "Explorer.exe" keine .net Assembly ist
(sondern native unmanaged code), die gehört ja auch zum Betriebssystem
und nicht zum .net Zeugs.

Folgendes sollte Dich Deinem Ziel zumindest nàher bringen:
[code]
try
{
string _filefullName = @"C:\WINDOWS\Explorer.EXE";
string _arbeitsplatz = Environment.GetFolderPath
(Environment.SpecialFolder.MyComputer);
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.StartInfo.FileName = _filefullName;
proc.StartInfo.Arguments = "\"" + _arbeitsplatz + "\"";
proc.Start();
//proc.WaitForInputIdle(3000);
IntPtr _fensterhandle = proc.MainWindowHandle;
IntPtr _prozesshandle = proc.Handle;
}
catch (Win32Exception ex)
{
MessageBox.Show("Error! HRESULT of error is " + ex.ErrorCode.ToString() +
Environment.NewLine +
" and native Win32 error is " +
ex.NativeErrorCode.ToString());
}

[/code]


Dann hast Du zumindest mal den gewünschten Prozess mit dem gewünschten
Ordner offen und Du hast ein Win32-Handle zum Prozess und eines zum
Hauptfenster des Prozesses.
Mit diesen Handles kannst Du dann irgendwie (ich glaube mit "Invoke" oder
"PInvoke") auf dessen Controls zugreifen (also auch auf den Titelbalken des
Fensters). Wie dies dann genau geht weiss ich auch noch nicht. Und vermutlich
könnte ein Antivirenprogramm auch noch was dagegen haben...

Hoffentlich hilft das schon mal ein Stück weiter.

Gruss,
Udo

Ähnliche fragen