2015-01-10 3 views
1

Я работаю над проектом, в котором я должен сначала разбить, а затем изменить размер окна на рабочем столе. Я могу разделить экран рабочего стола, используя службу pinvoke TileWindows. Но я застрял в другой части, чтобы изменить размер окон на рабочем столе. Потому что сначала я должен поймать событие, что какое-то окно размером на рабочем столе. Чтобы поймать это событие, я использовал код this, полученный в SO.события изменения размера окна окна C#

[DllImport("user32.dll", SetLastError = true)] 
internal static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventProc lpfnWinEventProc, int idProcess, int idThread, uint dwflags); 
[DllImport("user32.dll")] 
internal static extern int UnhookWinEvent(IntPtr hWinEventHook); 
internal delegate void WinEventProc(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int  idObject, int idChild, int dwEventThread, int dwmsEventTime); 

const uint WINEVENT_OUTOFCONTEXT = 0; 
const uint EVENT_SYSTEM_FOREGROUND = 3; 
private IntPtr winHook; 
private WinEventProc listener; 

public void StartListeningForWindowChanges() 
{ 
    listener = new WinEventProc(EventCallback); 
    //setting the window hook 
    winHook = SetWinEventHook(EVENT_SYSTEM_FOREGROUND, EVENT_SYSTEM_FOREGROUND, IntPtr.Zero, listener, 0, 0, WINEVENT_OUTOFCONTEXT); 
} 

public void StopListeningForWindowChanges() 
{ 
    UnhookWinEvent(winHook); 
} 

private static void EventCallback(IntPtr hWinEventHook, uint iEvent, IntPtr hWnd, int idObject, int idChild, int dwEventThread, int dwmsEventTime) 
{ 
    MessageBox.Show("I am here"); 
} 

проблема, которую я получаю, - это событие увольняется, даже если я не изменил размер окна на экране. И, как вы можете видеть, я положил messageBox в функцию eventCallback, и она всплывает, но интересно, что она ничего не показывает на своей кнопке ok.

+3

Это потому, что вы не слушаете для изменения размера событий, EVENT_SYSTEM_FOREGROUND говорит вам, когда окно перемещается на передний план. Вместо этого используйте EVENT_SYSTEM_MOVESIZEEND или EVENT_OBJECT_LOCATIONCHANGE. –

+0

спасибо, я изменил его на MOVESIZEEND, и теперь он стреляет с изменением размера, но все еще стреляет непрерывно, даже когда я ничего не изменил. И в этом поле сообщения ничего не отображается. –

+0

откровенно говоря, я использую pinvoke в первый раз, поэтому мои вопросы могут выглядеть глупыми вопросами. –

ответ

0

Как @HansPassant уже сказал, что вы должны использовать константу

  • EVENT_SYSTEM_MOVESIZEEND = 0x000B, который указывает, что: движение или изменение размеров окна завершено.

Event Constants

вы также получаете события из любого окна. Если вы посмотрите на подпись SetWinEventHook function:

HWINEVENTHOOK WINAPI SetWinEventHook(
    _In_ UINT eventMin, 
    _In_ UINT eventMax, 
    _In_ HMODULE hmodWinEventProc, 
    _In_ WINEVENTPROC lpfnWinEventProc, 
    _In_ DWORD idProcess, 
    _In_ DWORD idThread, 
    _In_ UINT dwflags 
); 

вы обнаружите, что:

  • idProcess - Задает идентификатор процесса, из которого функция крюк получает события. Укажите нуль (0) для приема событий из всех процессов на текущем рабочем столе.

Однако в вашем коде вы spacified 0 есть:

winHook = SetWinEventHook(
    EVENT_SYSTEM_FOREGROUND, 
    EVENT_SYSTEM_FOREGROUND, 
    IntPtr.Zero, 
    listener, 
    0, // <--- idProcess 
    0, 
    WINEVENT_OUTOFCONTEXT); 

Вы должны получить свой процесс ID слушать только события о вашем окне. Для этого вы можете использовать Process.Id Property. Я думаю, что это должно работать (это работает для меня):

const uint EVENT_SYSTEM_MOVESIZESTART = 0x000B; 

Process currentProcess = Process.GetCurrentProcess(); 

winHook = SetWinEventHook(
    EVENT_SYSTEM_MOVESIZEEND, 
    EVENT_SYSTEM_MOVESIZEEND, 
    IntPtr.Zero, 
    listener, 
    currentProcess.Id, 
    0, 
    WINEVENT_OUTOFCONTEXT); 
+0

Не уверен, что вы говорите. Ссылка, о которой вы упомянули, говорит, что укажите 0 для прослушивания всех процессов на рабочем столе. Это то, что мне нужно, чтобы слушать все процессы на рабочем столе. –

+0

О, я думал, вы хотите изменить размер только собственных окон, я плохой, -] – t3chb0t

Смежные вопросы