Официальный сайт студ.городка НГТУ
Программирование и БД » Програмно заблокировать кнопку пуск. 

#1  18.10.07 23:02

Програмно заблокировать кнопку пуск.

Суть такая, есть TOPMOST форма во всесь экран. соответственно при определённом раскладе форму не закрыть. но при нажатие кнопки пуск на клавиатуре работает очень хорошо, причём поверх формы(. нужно как-то этого избежать. на данный момент при запуске формы убивается эксплорер(и соответственно запускается при выходе).
хотелось бы услышать какие-нибудь конкретные советы(например какие API можно былобы заюзать и etc)

зы важно, что бы клавиатура не блокировалась.

Offline

#2  19.10.07 12:00

Re: Програмно заблокировать кнопку пуск.

Есть программа warrun, там есть эта опция.
Но ставить всю программу ради одной функции...

Offline

#3  19.10.07 12:03

juf
Профиль

Re: Програмно заблокировать кнопку пуск.

Код: csharp:

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
class TEST
{
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
 
public static void Main()
{
_hookID = SetHook(_proc);
Application.Run();
UnhookWindowsHookEx(_hookID);
}
 
private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using (Process curProcess = Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}
 
private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if ( (nCode >= 0) && (wParam == (IntPtr)WM_KEYDOWN) )
{
int vkCode = Marshal.ReadInt32(lParam);
if( ((Keys)vkCode == Keys.LWin)||((Keys)vkCode == Keys.RWin) )
{
Console.WriteLine("{0} blocked!", (Keys)vkCode);
return (IntPtr)1;
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
 
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
}


PS:
Проверенно на WinXP

Исправлено juf (19.10.07 12:05)

Offline

#4  19.10.07 13:13

Re: Програмно заблокировать кнопку пуск.

MSDN -> FindWindowEx + EnableWindow

Offline

#5  19.10.07 21:09

Maq
Профиль

Re: Програмно заблокировать кнопку пуск.

интересно, а в Висте проканает?))

Offline

#6  20.10.07 18:13

juf
Профиль

Re: Програмно заблокировать кнопку пуск.

Maq, не тестировал.

Offline

#7  24.10.07 09:53

asp
Профиль

Re: Програмно заблокировать кнопку пуск.

ИМХО, убивать explorer, даже запуская его по завершению - крайне неправильное решение. К тому же, explorer после таких манипуляций восстанавливает далеко не все задачи.

Offline

Программирование и БД » Програмно заблокировать кнопку пуск. 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.068 сек.
Выполнено 14 запросов.