WPF: KeyPreview in IE-Anwendung

24/07/2008 - 17:11 von Holger | Report spam
Hallo NG,

beim "rumprobieren" mit WPF habe ich versucht, ob man in einer IE-
Anwendung mit der WPF (XBAP - also wenn man direkt aus der
Entwickungsumgebung startet) das KeyPreview-Event vernünftig fangen
kann.Leider sieht es für mich so aus, dass das Event von PAGE nur dann
konsumiert wird, wenn irgendetwas in der Anwendung den Fokus hat
(Button, Textbox, etc.) Die Anwendung selbst kann (so scheint mir)
keinen Fokus bekommen. Inbesondere, wenn der Benutzer irgendwo im IE
hinklickt, bekommt die Anwendung keine Events mehr (von Fokus im
eigentlichen Sinn, kann man im IE ja eh nicht sprechen, oder?).

Ziel ist klar: Shortcuts in einer IE-Anwendung, so dass die Anwendung
möglichst sehr nah an eine Fat-Client-Anwendung ranreicht.

Gibt es dafür irgendeinen Trick den ich übersehen habe? Bin ich dafür
überhaupt in der richtigen Newsgroup?

Danke & Grüße
Holger Gubbels
 

Lesen sie die antworten

#1 Frank Dzaebel
27/07/2008 - 15:10 | Warnen spam
Hallo Holger,

beim "rumprobieren" mit WPF habe ich versucht, ob man in einer IE-
Anwendung mit der WPF (XBAP - also wenn man direkt aus der
Entwickungsumgebung startet) das KeyPreview-Event vernünftig fangen
kann. Leider sieht es für mich so aus, dass das Event von PAGE
nur dann konsumiert wird, wenn irgendetwas in der Anwendung
den Fokus hat (Button, Textbox, etc.)



Nutze bei einer WPF XBAP oder einer WPF-Window-App:
"ComponentDispatcher.ThreadPreprocessMessage".
Als Beispiel habe es hier nur mal in einer WPF-Window-App
über einen gehosteten WebBrowser:


//==// Window1.xaml:
//==
<Window x:Class="WpfBrowserKeyDown.Window1"
xmlns="http://schemas.microsoft.com/winfx/...tion"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WpfWebBrowser" Height="800" Width="800"
xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
Loaded="Window_Loaded">
<DockPanel LastChildFill="true">
<TextBox DockPanel.Dock="Top" Name="txtTaste" FontSize="16"
FontWeight="Bold" Foreground="DarkBlue">Taste:</TextBox>
<WindowsFormsHost Name="host" >
<wf:WebBrowser x:Name="webBrowser1"></wf:WebBrowser>
</WindowsFormsHost>
</DockPanel>
</Window>



//=// Window1.xaml.cs:
//=
/// <summary>Interaktionslogik für Window1.xaml</summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
ComponentDispatcher.ThreadPreprocessMessage + new ThreadMessageEventHandler(
ComponentDispatcher_ThreadPreprocessMessage);
}

const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x0104;

private void ComponentDispatcher_ThreadPreprocessMessage(
ref MSG msg, ref bool handled)
{
//using wf = System.Windows.Forms;
if (msg.message== WM_KEYDOWN || msg.message== WM_SYSKEYDOWN)
{
wf.Keys keyData = (wf.Keys)((int)((long)msg.wParam))
| wf.Control.ModifierKeys;
txtTaste.Text = "Taste [" + keyData.ToString() + "] gedrückt.";

//if (((keyData & wf.Keys.S) == wf.Keys.A) &&
// ((keyData & wf.Keys.Alt) == wf.Keys.Alt))
//{
// // "Alt+S wurde gedrückt" Beispiel für das Abfragen von MSG's
//}
}
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
webBrowser1.Url = new Uri("http://www.Dzaebel.NET");
}
}


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen