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 :
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
}
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.
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
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...