Laden...

Outlook Message automatisch bestätigen durch Nutzung der user32.dll

Erstellt von develc vor 19 Jahren Letzter Beitrag vor 18 Jahren 2.892 Views
develc Themenstarter:in
16 Beiträge seit 2004
vor 19 Jahren
Outlook Message automatisch bestätigen durch Nutzung der user32.dll

Hallo,

ich arbeite gerade mit C# an einem Mapi Agenten.
Nun bin ich auf das Problem getrofen, dass ich eine Outllook Meldung bestätigen muss, die nach Installation des MS Security Updates immer auftaucht.

Siehe Knowledge Base Articel :
WD2000: Warning Message: "A Program Is Trying to Access ..." When You Send Mail Merge to E-mail After You Apply Outlook Security Update
http://support.microsoft.com/default.aspx?scid=kb;en-us;263073

und Informationen für Entwickler :
OL98: Developer Information About the Outlook E-mail Security Update
http://support.microsoft.com/default.aspx?scid=kb;EN-US;262700

Das Problem an der Sache ist nun, dass das Fenster automatisch bestätigt werden muss, weil der Agent ja selbständig laufen soll.
Habe "schon" rausgefunden, dass man generell für die Problematik die user32.dll nutzen kann, die u.a. Funktionen wie FindWindow und SendMessage bereitstellt.
Desweiteren kann man mit Spy++ die WindowClass und die Parameter (wParam und lParam), die an das Fenster beim Click auf "Ja" gesendet werden, im hexFormat erfahren.
Bin mit meiner try and error Methode nun soweit, dass ich das Fenster erkennen kann, allerdings Sende ich als WM_Command einen falschen wNotifyCode Code 0 (gesendet von einem Menü) anstatt BN_CLICKED, obwohl ich die im Spy++ angegebenen hex Werte verwende.

Die Frage ist nun, wie man an den richtigen wNotifyCode kommt.
bzw. hat jemand einen anderen Vorschlag wie man WindowsFenster allgemein automatisch behandeln kann?

Bin echt für jeden Hinweis dankbar.

Hier ein paar code snippets :


Die Klasse mit dem Import der user32.dll und den Funktionen


public class Win32
{

	public const int WM_COMMAND = 0x111;


	[DllImport("User32.dll")]
	public static extern int FindWindow(string strClassName, string strWindowName);

	[DllImport("User32.dll")]
	public static extern int FindWindowEx(int hwndParent, int hwndChildAfter, string strClassName, string strWindowName);


	[DllImport("User32.dll")]
	public static extern Int32 SendMessage(
		int hWnd,               // handle to destination window
		int Msg,                // message
		int wParam,             // first message parameter
		[MarshalAs(UnmanagedType.LPStr)] string lParam); // second message parameter

	[DllImport("User32.dll")]
	public static extern Int32 SendMessage(
		int hWnd,               // handle to destination window
		int Msg,                // message
		int wParam,             // first message parameter
		int lParam);			// second message parameter

}



Main mit den Aufrufen :


System.Int32 iHandle
// Finding the window :
iHandle = Win32.FindWindow("#32770", "Microsoft Office Outlook");
// Send a Message
Win32.SendMessage(iHandle, Win32.WM_COMMAND, 0x000012A6, 0)
----------------------------------------------------------------------------------

Gruß develc

There are only ten types of people in the world. Those who understandy binary and those who do not.

M
267 Beiträge seit 2005
vor 18 Jahren

Servus,
ich bin an sowas auch grad dran, aber ich sehe du hast etwas anders wie ich, du musst ja nicht das Handel vom Outlook nehmen sondern das handel vom Button,
das bekommst du mit dem befehl FindWindowEx und dann kannst du SendMessage an das Handel des Buttons machen.... dann müsste es gehenl, bei mir geht es freu

findwindowex code:


	[DllImport("user32.dll", CharSet=CharSet.Auto)]
	public static extern IntPtr FindWindowEx(IntPtr parent,IntPtr next,string sClassName,string sWindowTitle);

	IntPtr hdlg = FindWindowEx(hwnd,IntPtr.Zero,"Button","HEX");

mein code:


[DllImport("user32.dll", CharSet=CharSet.Auto)]
	public static extern IntPtr FindWindowEx(IntPtr parent,IntPtr next,string sClassName,string sWindowTitle);
	[System.Runtime.InteropServices.DllImport("user32.dll", CharSet=System.Runtime.InteropServices.CharSet.Auto)]
	public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
	[DllImport("user32", EntryPoint="SendMessage")] 
	public static extern int SendMessage(IntPtr hDlg, int wMsg, int wParam, int lParam) ;

	const string lpClassName = "SciCalc";
	public const int WM_COMMAND = 0x00F1;
	public const int wparam = 00000001;
	public const int lparam = 00000000;

	static void SetzeHex(Boolean wert) 
	{
		IntPtr hwnd = FindWindow(lpClassName, null);
		IntPtr hdlg = FindWindowEx(hwnd,IntPtr.Zero,"Button","HEX");
		int a = SendMessage(hdlg,WM_COMMAND,Convert.ToInt32(wert),lparam );
	}


	[STAThread]
	static void Main(string[] args)
	{
		SetzeHex(true);
		Console.ReadLine();
		SetzeHex(false);
	}

...

Mfg
Tobias

No Risk, No Fun

502 Beiträge seit 2004
vor 18 Jahren

Hat zwar nicht direkt mit Deiner Frage zu tun, aber vielleicht hilft's Dir trotzdem irgendwie weiter:

Ich hatte vor einiger Zeit das gleiche Dilemma, aber nicht die Zeit (und zugegebenermasen auch nicht die Lust) das ganze programmiertechnisch zu lösen. Ein bisschen Googlen brachte mich dann zu einem kleinen Tool namens "OutlookClickYes" (genau Schreibweise bin ich mir nicht ganz sicher) und dieses nette Programm macht auch genau das, was der Name verspricht 🙂

Bart Simspon

Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...