Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
f446016f
Commit
f446016f
authored
May 02, 1999
by
Andrew Innes
Browse files
(sys_kill): Attach to current foreground thread
when grabbing focus; necessary on NT 5.0.
parent
55dcfc15
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
51 additions
and
18 deletions
+51
-18
src/w32proc.c
src/w32proc.c
+51
-18
No files found.
src/w32proc.c
View file @
f446016f
...
...
@@ -1359,25 +1359,58 @@ sys_kill (int pid, int sig)
}
foreground_window = GetForegroundWindow ();
if
(
foreground_window
&&
SetForegroundWindow
(
cp
->
hwnd
)
)
if (foreground_window)
{
/* Generate keystrokes as if user had typed Ctrl-Break or
Ctrl-C. */
keybd_event
(
VK_CONTROL
,
control_scan_code
,
0
,
0
);
keybd_event
(
vk_break_code
,
break_scan_code
,
(
vk_break_code
==
'C'
?
0
:
KEYEVENTF_EXTENDEDKEY
),
0
);
keybd_event
(
vk_break_code
,
break_scan_code
,
(
vk_break_code
==
'C'
?
0
:
KEYEVENTF_EXTENDEDKEY
)
|
KEYEVENTF_KEYUP
,
0
);
keybd_event
(
VK_CONTROL
,
control_scan_code
,
KEYEVENTF_KEYUP
,
0
);
/* Sleep for a bit to give time for Emacs frame to respond
to focus change events (if Emacs was active app). */
Sleep
(
10
);
SetForegroundWindow
(
foreground_window
);
}
}
/* NT 5.0, and apparently also Windows 98, will not allow
a Window to be set to foreground directly without the
user's involvement. The workaround is to attach
ourselves to the thread that owns the foreground
window, since that is the only thread that can set the
foreground window. */
DWORD foreground_thread, child_thread;
foreground_thread =
GetWindowThreadProcessId (foreground_window, NULL);
if (foreground_thread == GetCurrentThreadId ()
|| !AttachThreadInput (GetCurrentThreadId (),
foreground_thread, TRUE))
foreground_thread = 0;
child_thread = GetWindowThreadProcessId (cp->hwnd, NULL);
if (child_thread == GetCurrentThreadId ()
|| !AttachThreadInput (GetCurrentThreadId (),
child_thread, TRUE))
child_thread = 0;
/* Set the foreground window to the child. */
if (SetForegroundWindow (cp->hwnd))
{
/* Generate keystrokes as if user had typed Ctrl-Break or
Ctrl-C. */
keybd_event (VK_CONTROL, control_scan_code, 0, 0);
keybd_event (vk_break_code, break_scan_code,
(vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY), 0);
keybd_event (vk_break_code, break_scan_code,
(vk_break_code == 'C' ? 0 : KEYEVENTF_EXTENDEDKEY)
| KEYEVENTF_KEYUP, 0);
keybd_event (VK_CONTROL, control_scan_code,
KEYEVENTF_KEYUP, 0);
/* Sleep for a bit to give time for Emacs frame to respond
to focus change events (if Emacs was active app). */
Sleep (100);
SetForegroundWindow (foreground_window);
}
/* Detach from the foreground and child threads now that
the foreground switching is over. */
if (foreground_thread)
AttachThreadInput (GetCurrentThreadId (),
foreground_thread, FALSE);
if (child_thread)
AttachThreadInput (GetCurrentThreadId (),
child_thread, FALSE);
}
}
/* Ctrl-Break is NT equivalent of SIGINT. */
else if (!GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT, pid))
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment