У вас есть две проблемы с дизайном:
Как вызвать метод экземпляра из статического метода
Поскольку метод HookCallBack
static, Form1.newKeyPress () необходимо
будь статичным.
Вы можете передать экземпляр своей основной формы в свой метод HookCallBack
, вам просто нужно добавить дополнительный параметр в ваш статический метод:
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam, Form1 form)
{
// ...
}
Это на самом деле предпочтительная стратегия. Везде, где ваши методы и классы имеют зависимости от других объектов, вы должны передавать свои зависимости в ваши методы, а не выводить их из глобального состояния.
За исключением этого, вы можете просмотреть цикл Application.OpenForms и найти искомую форму следующим образом:
var form = Application.OpenForms.OfType<Form1>().First();
form.newKeyPress();
Как открыть один экземпляр формы одновременно
Другие люди предложили сделать вашу форму статичной - это один из подходов, но это плохой подход. Статические формы не получают мусор при их удалении, вы должны реализовать свои собственные методы init / reset, когда вы показываете / скрываете форму, если статическая форма имеет ссылки на другие объекты, ваше приложение будет медленно пропускать память, среди прочего . Я действительно рекомендую что-то вроде этого:
class FormFactory
{
public Form1 GetForm1()
{
return Application.OpenForms.OfType<Form1>().FirstOrDefault ?? new Form1();
}
}
Таким образом, ваш FormFactory контролирует время жизни вашей формы, теперь вы можете получить существующий или новый экземпляр Form1, используя new FormFactory.GetForm1()
.