Нет необходимости в специфичном для angular2 решении. Вы можете использовать window.location.hostname
для получения текущего имени хоста.
Обратите внимание, однако, что если вы не хотите использовать глобальные переменные, такие как объект window
напрямую, вы можете предоставить свой собственный объект Window
, который затем можно внедрить.
Подробнее см. Этот полный рабочий угловой образец Штакблица .
Как уже говорили другие, оригинальный ответ больше не работает. Для Angular 6+ вам необходимо предоставить Injection Token , чтобы window
-объект можно было разрешить и в AOT -стройке.
Я рекомендую создать массив WINDOW_PROVIDERS
в отдельном файле, например так:
import { InjectionToken, FactoryProvider } from '@angular/core';
export const WINDOW = new InjectionToken('window');
const windowProvider: FactoryProvider = {
provide: WINDOW,
useFactory: () => window
};
export const WINDOW_PROVIDERS = [
windowProvider
]
Константу WINDOW_PROVIDERS
можно добавить в массив providers
в AppModule
следующим образом:
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule
],
providers: [
WINDOW_PROVIDERS, // <- add WINDOW_PROVIDERS here
SampleService,
],
bootstrap: [AppComponent]
})
export class AppModule { }
В SampleService
объект window
может быть введен с помощью определенного маркера , например:
import { Injectable, Inject } from '@angular/core';
import { WINDOW } from '../window.provider';
@Injectable()
export class SampleService {
constructor(@Inject(WINDOW) private window: Window) {
}
getHostname() : string {
return this.window.location.hostname;
}
}
Поэтому вам нужно установить провайдера для Window
-объекта при загрузке вашего приложения.
import {provide} from 'angular2/core';
bootstrap(..., [provide(Window, {useValue: window})]);
После этого вы можете использовать объект окна и получить доступ к имени хоста следующим образом:
constructor(private window: Window) {
var hostname = this.window.location.hostname;
}
Я нашел способ использовать WndProc благодаря ссылке, которую прислал мне Лассе. Спасибо за ответ, Джон, но это было не совсем то, что я хотел. Для тех, кто хочет знать, как я это сделал, я использовал следующее:
protected override void WndProc(ref Message m)
{
const int WM_NCHITTEST = 0x0084;
switch (m.Msg)
{
case WM_NCHITTEST:
return;
}
base.WndProc(ref m);
}
Я не тестировал его тщательно, поэтому не знаю, есть ли какие-либо побочные эффекты, но на данный момент он отлично работает для меня :).
Почему бы вместо этого не установить свойство FormBorderStyle
соответствующим образом? Тогда вам не нужно использовать WndProc
.
Вот пример кода для демонстрации - нажмите кнопку, чтобы выбрать, можно ли изменять размер формы:
using System;
using System.Windows.Forms;
using System.Drawing;
class Test
{
[STAThread]
static void Main(string[] args)
{
Button button = new Button
{
Text = "Toggle border",
AutoSize = true,
Location = new Point(20, 20)
};
Form form = new Form
{
Size = new Size (200, 200),
Controls = { button },
FormBorderStyle = FormBorderStyle.Fixed3D
};
button.Click += ToggleBorder;
Application.Run(form);
}
static void ToggleBorder(object sender, EventArgs e)
{
Form form = ((Control)sender).FindForm();
form.FormBorderStyle = form.FormBorderStyle == FormBorderStyle.Fixed3D
? FormBorderStyle.Sizable : FormBorderStyle.Fixed3D;
}
}
Для этого достаточно установить FormBorderStyle. Почему вы используете для этого WndProc?
@Ozzy / Lasse Работал на меня!
Возникла та же проблема:
Стандартные стили границ не выглядят так, как я хочу, в отличие от пользовательских CreateParams. Я указал те же значения для Size, MinimumSize и MaximumSize, чтобы отключить изменение размера. Курсоры изменения размера все еще устанавливались, благодаря Оззи и Лассе, теперь это обрабатывается путем фильтрации WM_NCHITTEST ...
Спасибо