Hallo,
ich möchte meine .chm Hilfe gerne Kontextbezogen öffnen.
Zusätzlich möchte ich aber auch Fehler auswerten wie zB. 'Topic oder Hilfedatei' nicht gefunden.
Die System.Windows.Forms.Help.ShowHelp Methode gibt leider keine Fehler aus.
Deshalb möchte ich direkt über die hhctrl.ocx die Hilfe öffnen.
Mit diesem Code kann ich die Hilfe korrekt öffnen wenn Topic und die Datei vorhanden sind:
private enum HTMLHelpCommand : uint
{
HH_HELP_CONTEXT = 0x000F,
HH_GET_LAST_ERROR = 0x0014
}
[DllImport("hhctrl.ocx", SetLastError = true, EntryPoint = "HtmlHelpW", CharSet = CharSet.Unicode)]
private static extern IntPtr HtmlHelp(
IntPtr hWndCaller,
[MarshalAs(UnmanagedType.LPWStr)]
string helpFile,
HTMLHelpCommand command,
IntPtr data);
IntPtr result = HtmlHelp(
control.Handle,
path,
HTMLHelpCommand.HH_HELP_CONTEXT,
new IntPtr(topicId));
Und jetzt mein Problem: Wenn ein Fehler passiert möchte ich diesen mit HH_GET_LAST_ERROR auslesen. Leider liefert das folgende Beispiel kein Ergebnis:
[DllImport("hhctrl.ocx", SetLastError = true, EntryPoint = "HtmlHelpW", CharSet = CharSet.Unicode)]
private static extern IntPtr HtmlHelp(
IntPtr hWndCaller,
[MarshalAs(UnmanagedType.LPWStr)]
string pszFile,
HTMLHelpCommand uCommand,
[MarshalAs(UnmanagedType.LPStruct)]
HH_LAST_ERROR dwData);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class HH_LAST_ERROR
{
public int cbStruct = Marshal.SizeOf(typeof(HH_LAST_ERROR));
public int hr = 0;
[MarshalAs(UnmanagedType.BStr)]
public string description = "";
}
HH_LAST_ERROR lastError = new HH_LAST_ERROR();
IntPtr result1 = HtmlHelp(
control.Handle,
null,
HTMLHelpCommand.HH_GET_LAST_ERROR,
lastError);
Kann mir jemand sagen wo mein Problem liegt?
Oder gibt es überhaupt eine bessere Lösung?
Vielen Dank!
Ja, dass war der entscheidende und auch so einfache Tipp...
this.webBrowser.Invoke(new MethodInvoker(() => { this.webBrowser.Document.Write(teilHtml); }));
Vielen Dank!
EDIT: Wie setzt man den Beitrag auf erledigt?
Hallo herbivore,
vielen Dank für deine Antwort.
Ich habe hier einmal schnell einen Testcode gebastelt:
StringBuilder myHtml = new StringBuilder();
private void buttonTest_Click(object sender, EventArgs e)
{
this.myHtml
.AppendLine("<SCRIPT LANGUAGE=\"JavaScript1.1\">")
.AppendLine("as=true;")
.AppendLine("function doscroll() {")
.AppendLine("if (as != false) { window.scroll(1, 1000000); }")
.AppendLine("window.setTimeout(\"doscroll()\", 200);")
.AppendLine("}")
.AppendLine("doscroll();")
.AppendLine("</SCRIPT>");
Thread testThread = new Thread(() =>
{
for (int i = 0; i < 100; i++)
{
myHtml.AppendLine("test" + i + "<br>");
webBrowser.DocumentText = myHtml.ToString();
Thread.Sleep(1000);
}
});
testThread.Start();
}
Wenn das WebBrowser Control entsprechend klein ist kann man das springen der Scollbar beobachten.
Also mein Problem ist, dass sich das HTML ständig um eine Zeile erweitert. zB. so wie bei einem Chat.
Natürlich habe ich jetzt deine Vorgeschlagenen Threads durchstöbert. Ich bin aber leider nicht auf die passende Idee gestossen.
lg chris
Hallo,
ich habe folgendes Problem:
Es wird im Programm WebBrowser.DocumentText gesetzt.
Funktionier auch soweit.
Das HTML welches in die DocumentText Eigenschaft gesetzt wird kommt von extern.
Dh. übertrieben schaut der Source so aus:
while (true)
{
this.webBrowser.DocumentText = html;
}
Sogar das funktioniert. Evt. gibt es aber schon hierfür eine bessere Lösung?
Nur mein Hauptproblem liegt darin, dass wenn das HTML so lange wird das eine Scrollbar eingeblendet werden muss "zuckt" die Anzeige im Browser.
Die Scrollbars richten sich zuerst in den Ursprungszustand aus und scrollen danach erst ans Ende des Dokuments.
Auch SuspendLayout bringt keinen Erfolg.
Hat jemand eine passende Idee für mich?
lg chris