Рейтинг:
10
0x01AA
Вы можете использовать сервис interop для решения вашего запроса.
using System.Runtime.InteropServices;
public partial class FormMain : Form
{
//
// WINAPI definitions, copeied from windows.h
enum SetWinPos_ZOrderOpt{HWND_TOP = 0,
HWND_BOTTOM = 1,
HWND_TOPMOST = -1,
HWND_NOTOPMOST = -2}
enum SetWinPosFlags
{
SWP_NOSIZE = 0x0001,
SWP_NOMOVE = 0x0002,
SWP_NOZORDER = 0x0004,
SWP_NOREDRAW = 0x0008,
SWP_NOACTIVATE = 0x0010,
SWP_FRAMECHANGED = 0x0020, /* The frame changed: send WM_NCCALCSIZE */
SWP_SHOWWINDOW = 0x0040,
SWP_HIDEWINDOW = 0x0080,
SWP_NOCOPYBITS = 0x0100,
SWP_NOOWNERZORDER = 0x0200, /* Don't do owner Z ordering */
SWP_NOSENDCHANGING = 0x0400, /* Don't send WM_WINDOWPOSCHANGING */
SWP_DRAWFRAME = SWP_FRAMECHANGED,
SWP_NOREPOSITION = SWP_NOOWNERZORDER
}
//
// Import SetWindowPos
[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
public static extern IntPtr SetWindowPos(int hWnd, int hWndInsertAfter,
int X, int Y, int cx, int cy,
uint flages);
// Start Notepad and set TOOPMOST
private void buttonTestTopLevel_Click(object sender, EventArgs e)
{
Process myProcess = new Process();
try
{
this.TopMost = false;
string winpath = Environment.GetEnvironmentVariable("windir");
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = winpath + @"\system32\notepad.exe"; // See Note 1
myProcess.Start();
myProcess.WaitForInputIdle();
{
// Here HWND_TOPMOST does it's Job
SetWindowPos(myProcess.MainWindowHandle.ToInt32(),
(int)SetWinPos_ZOrderOpt.HWND_TOPMOST,
0, 0, 0, 0,
(int)(SetWinPosFlags.SWP_NOSIZE |
SetWinPosFlags.SWP_NOMOVE |
SetWinPosFlags.SWP_SHOWWINDOW));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
// ...
}
Примечание 1:
Здесь вы можете столкнуться с проблемами, если ваше приложение 32-битное, а Win-64-битное.
Надеюсь, это поможет.
TatsuSheva
Спасибо, вы спасли мне жизнь.
TatsuSheva
На самом деле мой выигрыш 64-битный, но он отлично работает.
0x01AA
Да, это работает, если все сходится. Я предполагаю,что в настройках Вашего проекта вы сняли флажок "32-битный предпочтительный", так что все в порядке. Если вы установите этот флажок, то ваше приложение будет работать как 32-битное и вызовет проблемы с приведенным выше примером. Тогда обходной путь состоит в том, чтобы начать Notepad.exe от C:\Windows\SysWOW64 где находится 32-битная версия Блокнота.
TatsuSheva
Ладно, спасибо.
TatsuSheva
Я попытался открыть Word, поставив WINWORD.EXE он показывает мне ошибку x)
0x01AA
Что именно является сообщением об ошибке?
TatsuSheva
указанный файл неизвестен
Я просто должен был положить путь
0x01AA
И действительно ли он показывает его как самый верхний? Когда я пытаюсь это сделать, это не происходит, если только я не делаю нить.Sleep (200) перед SetWindowsPos.
TatsuSheva
Здравствуйте, вы пробовали воспользоваться калькулятором ? Это работает с вами ?
0x01AA
Привет, у меня это не работает :(
TatsuSheva
Есть решение ?
0x01AA
Извините, понятия не имею...