• 0

[C#] WPF Window with transparency makes WindowsFormsHost disappear


Question

5 answers to this question

Recommended Posts

  • 0
  Nazgulled said:
Hi,

I have a WPF window without border and with Allow Transparency set to true but this makes any WindowsFormsHost component inside the WPF window disappear.

Is there any workaround to solve this?

You'll have to go old school.

I've seen in a few spots on the web where people are asking about using the WebBrowser control with a borderless window. I wondered the same thing. Using straight WPF you can not. However, being the old man that I am, I remember how to use the Win API. Below is the code to not only do it but I threw in some dragging code for good measure.

#region The Classic Window API

//The SendMessage function sends a message to a window or windows.

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]

static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

//ReleaseCapture releases a mouse capture

[DllImportAttribute("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]

public static extern bool ReleaseCapture();

//SetWindowLong lets you set a window style

[system.Runtime.InteropServices.DllImport("user32.dll")]

static extern int SetWindowLong(IntPtr hWnd, int nIndex, long dwNewLong);

#endregion

/* Borderless - The window which contains the WebBrowser control* /

Window win = new Window();

const int GWL_STYLE = -16;

const long WS_POPUP = 2147483648;

IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(win).Handle;

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);

/* Drag Window - Capture this on the mouse down of a control in the window*/

ReleaseCapture();

SendMessage(hWnd, 0xa1, 0x2, 0);

  • 0
  SimpleJack said:
You'll have to go old school.

I've seen in a few spots on the web where people are asking about using the WebBrowser control with a borderless window. I wondered the same thing. Using straight WPF you can not. However, being the old man that I am, I remember how to use the Win API. Below is the code to not only do it but I threw in some dragging code for good measure.

#region The Classic Window API

//The SendMessage function sends a message to a window or windows.

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]

static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

//ReleaseCapture releases a mouse capture

[DllImportAttribute("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]

public static extern bool ReleaseCapture();

//SetWindowLong lets you set a window style

[system.Runtime.InteropServices.DllImport("user32.dll")]

static extern int SetWindowLong(IntPtr hWnd, int nIndex, long dwNewLong);

#endregion

/* Borderless - The window which contains the WebBrowser control* /

Window win = new Window();

const int GWL_STYLE = -16;

const long WS_POPUP = 2147483648;

IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(win).Handle;

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);

/* Drag Window - Capture this on the mouse down of a control in the window*/

ReleaseCapture();

SendMessage(hWnd, 0xa1, 0x2, 0);

Are we sure this works?

  • 0
  dotnetukguru said:
Are we sure this works?

Works like a champ. Also, lets say you have the WebBrowser control in a grid and you want to set margins to provide transparency around the browser. Just extend the glass to the entire window and set your win.Background to Transparent and you are good to go.

In Summary:

IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(win).Handle;

const int GWL_STYLE = -16;

int style = GetWindowLong(hWnd, GWL_STYLE)

SetWindowLong(hWnd, GWL_STYLE, style );

Extend the glass - Adam Nathan - Extend Glass

Off you go

  • 0
  SimpleJack said:
Also, I had a WS_POPUP constant in the original code. I found it wasn't needed.

Man, I feel like a moron! Yes, you do need the WS_POPUP constant. Sorry about that!

This is the only code you need once you extend the glass and make the background transparent

IntPtr hWnd = new System.Windows.Interop.WindowInteropHelper(win).Handle;

SetWindowLong(hWnd, GWL_STYLE, WS_POPUP);

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • That will generate <1min shorts videos for me, based on text input? (and maybe a stock image upload, if not, text input only is fine) I understand that there may not be any that DON'T require a login or signup, which is fine, I'll create a login if needed - but are there any free services where i don't need a sub or to refill credits or whatnot to continue using? Thanks!
    • I'll be getting one (upgrading from AW6). Hoping it's got 3 day battery life. I'll take 2, but prefer 3.
    • I would suggest Ubiquiti Cloud Gateway Fiber + U7 Pro XGS   https://store.ui.com/us/en/category/all-cloud-gateways/collections/cloud-gateway-fiber/products/ucg-fiber https://store.ui.com/us/en/category/wifi-flagship/products/u7-pro-xgs?variant=u7-pro-xgs-us I have been using this combo for 3 months now.
    • YouTube app is no longer compatible with several iPhones by Taras Buria Google is rolling out a new update for the YouTube app on iOS, and it is bad news for those still using an old iPhone. Starting with version 20.22.1, the latest release in the App Store, YouTube for iPhone now requires iOS 16 and newer. Previously, the app required a device with iOS 15 and newer. The new hardware requirement makes several iPhones incompatible with the latest version of the YouTube app. Those include the iPhone 6S / 6S Plus, iPhone 7 / 7 Plus, and the original iPhone SE. The seventh-generation iPod touch is also no longer compatible. On the iPad side, the update kicks out the second-generation iPad Air and the fourth-generation iPad mini. Although old iPhones can no longer install YouTube version 20.22.1 and newer, old versions continue working just fine. However, going forward, users will not receive new features and improvements. Also, at some point in the future, the app will stop working altogether. Another workaround is to use the web version of the app, but that also provides a limited experience compared to the up-to-date client. Google is not the only service that kicks out old and now unsupported Apple devices. Recently, WhatsApp developers dropped iPhones that cannot run iOS 15.1 or newer. The news is clearly a bummer for those who are still using their old iPhones, which, to Apple's credit, have a solid lifespan (as long as you are happy with the battery life). However, it is also worth keeping in mind that the iPhone 6S series was released almost a decade ago. Having ten years of support is impressive, but it is clearly time to move on. Perhaps my friend with his day-one iPhone 7 Black can finally consider buying something less ancient.
  • Recent Achievements

    • One Month Later
      Parotel earned a badge
      One Month Later
    • Reacting Well
      Cryptecks earned a badge
      Reacting Well
    • Week One Done
      primussolicitors798 earned a badge
      Week One Done
    • First Post
      nothin earned a badge
      First Post
    • Enthusiast
      Epaminombas went up a rank
      Enthusiast
  • Popular Contributors

    1. 1
      +primortal
      188
    2. 2
      snowy owl
      134
    3. 3
      ATLien_0
      130
    4. 4
      Xenon
      119
    5. 5
      +FloatingFatMan
      97
  • Tell a friend

    Love Neowin? Tell a friend!